2

我在处理日期时遇到了一些麻烦。

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

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

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

FechaInicio 日期时间不为空

向 Web 服务发出请求,我得到以下格式的日期(在 JSON 中):

“FechaInicio”:“1982-12-02T00:00:00”

并在 tne 实体上调用 FechaInicio() 返回一个 javascript Date 对象。

创建一个新实体我得到以下值:

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;
};

毕竟,我真正的问题是:我应该使用什么格式来为日期类型字段分配新值?

编辑:

在做了一些测试之后,我注意到如果我为属性分配一个 Date 对象,一切似乎都很好,直到我们到达这一行:

saveBundleStringified var = JSON.stringify (saveBundle);

saveBundle 内容为:

FechaInicio: Thu Dec 20 2012 00:00:00 GMT+0100 (Hora estándar romance)

和 saveBundleStringified:

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

最后存入数据库的是:2012-12-19 23:00:00.0000000

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

function fastDateParse(y, m, d, h, i, s, ms){ //2012 12 19 23 00 00 ""
    return new Date(y, m - 1, d, h || 0, i || 0, s || 0, ms || 0);
}

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

4

3 回答 3

4

抱歉拖了这么久...

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

感谢您找到这些。

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

于 2012-12-15T02:04:49.810 回答
1

约会总是让我害怕。我的直觉是浏览器和服务器不在同一个时区;我不知道怎么会这样。无论如何,它一定会发生,我记得在日期时间协调客户端和服务器的各种基本问题。我认为通常的建议始终是将所有内容保持在 UTC 中,并调整您在本地时间向用户显示的内容。

我相当怀疑这是一个有用的答案。我不确定 Breeze 在解决这个问题时应该扮演什么角色。欢迎提出我们可以传播并建立共识的建议。

你也能澄清一下这个说法:

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

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

是的,@Sascha,Breeze 使用 Web Api 标准进行 JSON 格式化(Json.Net),它设置为 ISO8601 格式,而不是古怪的 Microsoft 格式(在我写这篇文章时它逃脱了我)。

于 2012-12-12T18:59:39.413 回答
0

Breeze/Web Api 似乎需要一些特殊格式(ISO8601)的日期。任何其他格式都不适合我。moment.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));
    };
于 2012-12-12T12:32:55.577 回答