我注意到,如果从服务器返回的日期属性值为“2013-07-11T17:11:04.700”,则 Breeze 会将值更改为Thu Jul 11 19:11:04 UTC + 0200 2013。
请注意,时间现在提前2个小时了!
保存实体时我已经遇到了这个问题,因此我必须使用momentjs显式转换日期属性:
date.hours(date.hours() - moment().zone() / 60);
但是现在看来,执行读取操作时也会出现此问题。
确保 Breeze 不会更改日期属性值的最佳方法是什么?
最佳答案
Breeze 不会以任何方式操纵往返于服务器的日期时间 EXCEPT来为从服务器返回的任何尚无UTZ时区说明符添加一个UTZ时区说明符。这样做是因为不同的浏览器在没有时区说明符的情况下对日期的解释不同,并且我们希望浏览器之间具有一致性。
问题的根源可能是,将带有日期的数据保存到数据库时,您使用的dateTime数据类型不包含时区偏移量。这意味着在检索数据时,您可能会“丢失”该偏移量,并且上述的Breeze默认值也会生效。这可以通过使用具有时区偏移量的数据库日期时间数据类型(在SQLServer中为datetime2或datetimeoffset)来更正。
请注意,您的浏览器会根据其当前时区格式化日期。
另一种方法是,如果未提供Breeze的DataType.parseDateFromServer,则可以不推断任何时区信息:
breeze.DataType.parseDateFromServer = function (source) {
return new Date(Date.parse(source));
};
但是,这可能会遇到这样的问题,即不同的浏览器解释DateTime字符串而没有时区偏移不同...因此,根据浏览器的不同,您仍然可能会得到奇怪的结果。如果发生这种情况,您将需要在上面的代码段中添加一些浏览器检测代码。
另一种选择是使用moment.js库执行以下操作。
breeze.DataType.parseDateFromServer = function (source) {
var date = moment(source);
return date.toDate();
};
不确定这样做有多大帮助,但希望Breeze的行为更加清晰。
关于date - breezejs : date is not set to the right time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17657459/