Breeze 在微风中处理日期

Breeze 在微风中处理日期,breeze,Breeze,我在约会方面遇到了一些问题 我有一个带有日期字段的对象: 公共日期时间FechaInicio{get;set;} 此定义在数据库中生成以下字段: FechaInicio日期时间不为空 向web服务发出请求时,我将获得以下格式的日期(JSON格式): “费切尼西奥”:“1982-12-02T00:00:00” 对实体调用FechaInicio()将返回一个javascript日期对象 创建新实体时,我得到以下值: createPalanca var = function () { Meta

我在约会方面遇到了一些问题

我有一个带有日期字段的对象:

公共日期时间FechaInicio{get;set;}

此定义在数据库中生成以下字段:

FechaInicio日期时间不为空

向web服务发出请求时,我将获得以下格式的日期(JSON格式):

“费切尼西奥”:“1982-12-02T00:00:00”

对实体调用FechaInicio()将返回一个javascript日期对象

创建新实体时,我得到以下值:

createPalanca var = function () {
    MetadataStore var = manager.metadataStore;
    metadataStore.getEntityType palancaType = var ("Toggle");
    palancaType.createEntity newPalanca = var ();
    manager.addEntity (newPalanca);

    //Here: newPalanca.FechaInicio () has the value in this format: 1355313343214
    //Expected Date object here
    newPalanca return;
};
毕竟,我真正的问题是:我应该使用什么格式来分配新值​​到日期类型字段

编辑:

在做了一些测试之后,我注意到,如果我为属性指定了一个日期对象,那么在我们到达这一行之前,一切似乎都很好:

saveBundleStringified var=JSON.stringify(saveBundle)

saveBundle内容是:

FechaInicio: Thu Dec 20 2012 00:00:00 GMT+0100 (Hora estándar romance)
而savebundle则进行了本地化:

"FechaInicio": "2012-12-19T23:00:00.000Z" <- I guess this is utc format

如果我错了,请纠正我,但我认为这就是问题所在。

Breeze/Web Api似乎需要一些特殊格式的日期(ISO8601)。任何其他格式都不适合我。js通过设置和阅读为我解决了这个问题。如果使用Knockout来显示带有特殊绑定的日期,那么格式化也可以很好地完成

entity.someDate(moment().utc().toDate()) // example
它是有效的

您还可以使用以下选项:

Date.prototype.setISO8601 = function(string) {
        var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
            "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
            "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
        var d = string.match(new RegExp(regexp));

        var offset = 0;
        var date = new Date(d[1], 0, 1);

        if (d[3]) {
            date.setMonth(d[3] - 1);
        }
        if (d[5]) {
            date.setDate(d[5]);
        }
        if (d[7]) {
            date.setHours(d[7]);
        }
        if (d[8]) {
            date.setMinutes(d[8]);
        }
        if (d[10]) {
            date.setSeconds(d[10]);
        }
        if (d[12]) {
            date.setMilliseconds(Number("0." + d[12]) * 1000);
        }
        if (d[14]) {
            offset = (Number(d[16]) * 60) + Number(d[17]);
            offset *= ((d[15] == '-') ? 1 : -1);
        }

        offset -= date.getTimezoneOffset();
        time = (Number(date) + (offset * 60 * 1000));
        this.setTime(Number(time));
    };

约会总是让我害怕。我的直觉是浏览器和服务器不在同一时区;我不知道怎么会这样。在任何情况下,这都是不可避免的,我记得在datetime上协调客户机和服务器的各种基本问题。我认为通常的建议是将所有内容保持在UTC,并在本地时间调整您向用户显示的内容

我很怀疑这是一个有用的答案。我不确定Breeze应该在解决这个问题中扮演什么角色。我们欢迎一项建议,即我们可以围绕这一问题传播和建立共识

你能否澄清这一说法:

当调用SaveChanges的结果返回时,它们将在函数updateEntity处与缓存中的实体合并,该函数执行此检查:if(!core.isDate(val))返回false。因此,会创建一个日期错误的新日期对象

你说的“错误的日期”是什么意思?您是说Breeze认为传入日期值的格式无效(而不是您期望的日期)


是的,@Sascha,Breeze使用的是用于JSON格式(JSON.Net)的Web Api标准,它被设置为ISO8601格式,而不是古怪的Microsoft格式(在我写这篇文章时,我没有意识到这一点)

抱歉花了这么长时间

Breeze的DateTime时区序列化和用于具有不可为空的日期字段的新构造实体的默认DateTime值存在错误。从v 0.77.2开始,这些是固定的。请确认这组修复程序是否适用于您

谢谢你找到这些


为了回答您的问题,对象上的所有日期属性都应该设置为javascript日期。Breeze应该正确处理所有序列化问题

嗯,你的回答不帮助我,事实上时刻().utc().toDate()等于新日期()(在chrome控制台中尝试)。请看我编辑的问题。如果我没有错的话,当你用Javascript创建一个新的日期时,它是用客户端时区(在我的例子中是GMT+1)创建的。如果微风在做:新的日期(y,m-1,d,h | 0,i | 0,s | 0,ms | 0);但是来自服务器的日期是UTC,不应该将收到的日期转换为客户端的时区吗?这就是为什么我认为breeze返回了错误的日期。我不确定breeze对某个日期做任何事情是否明智。当我说“我不确定”时,这就是我的意思。。。我真的没有对微风应该做什么或不应该做什么采取立场。我认为我们需要有一个更广阔的视角。让我们四处逛逛,好吗?同时,你能在微风的当前状态下继续你的工作吗?没问题,在我们澄清日期主题的同时,我可以继续做其他事情。还要注意,创建新实体(日期字段不为null)时,默认值是数字(自1970年1月1日午夜以来的毫秒数),而不是日期类型的对象。在任何情况下,如果使用当前版本的breeze,您已经成功创建了一个实体,保存一个日期,然后进行修改(由用户在文本字段中输入),那么您就有了一些示例,我和您做同样的操作没有问题。这应该从v 0.77.2开始修复。请让我们知道修复是否对您有效(感谢您找到了bug)。
Date.prototype.setISO8601 = function(string) {
        var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
            "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
            "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
        var d = string.match(new RegExp(regexp));

        var offset = 0;
        var date = new Date(d[1], 0, 1);

        if (d[3]) {
            date.setMonth(d[3] - 1);
        }
        if (d[5]) {
            date.setDate(d[5]);
        }
        if (d[7]) {
            date.setHours(d[7]);
        }
        if (d[8]) {
            date.setMinutes(d[8]);
        }
        if (d[10]) {
            date.setSeconds(d[10]);
        }
        if (d[12]) {
            date.setMilliseconds(Number("0." + d[12]) * 1000);
        }
        if (d[14]) {
            offset = (Number(d[16]) * 60) + Number(d[17]);
            offset *= ((d[15] == '-') ? 1 : -1);
        }

        offset -= date.getTimezoneOffset();
        time = (Number(date) + (offset * 60 * 1000));
        this.setTime(Number(time));
    };