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