Date 日期未设置为正确的时间

Date 日期未设置为正确的时间,date,breeze,Date,Breeze,我注意到,如果从服务器返回的日期属性值为“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不会改变日期属性值的最佳方法是什么 B

我注意到,如果从服务器返回的日期属性值为“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不会以任何方式操纵进出服务器的日期时间,除非向服务器返回的任何日期添加UTZ时区说明符,而这些日期尚未具有UTZ时区说明符。之所以这样做,是因为不同的浏览器对没有时区说明符的日期的解释不同,我们希望浏览器之间保持一致

问题的根源可能是,当您将带有日期的数据保存到数据库时,您使用的dateTime数据类型不包含时区偏移量。这意味着,当检索到数据时,您可能会“丢失”偏移量,并且上面提到的Breeze默认值将生效。这可以通过使用带有时区偏移量(SQLServer中的datetime2或datetimeoffset)的数据库日期时间数据类型来更正

请注意,您的浏览器不会根据当前时区设置日期格式

另一种方法是,如果未提供任何时区信息,则可以替换Breeze的DataType.parseDateFromServer以不推断任何时区信息:

breeze.DataType.parseDateFromServer = function (source) {
     return new Date(Date.parse(source));
};
但是,这可能会遇到这样的问题,即不同的浏览器对没有时区偏移的日期时间字符串的解释不同。。。因此,根据浏览器的不同,您可能仍然会得到奇怪的结果。如果发生这种情况,您需要向上面的代码段添加一些浏览器检测代码

另一种选择是使用moment.js库执行以下操作

breeze.DataType.parseDateFromServer = function (source) {
     var date = moment(source); 
     return date.toDate();   
};

不确定这有多大帮助,但希望Breeze的行为更清楚

默认情况下,Breeze不提供任何方法,但您可以在模型JS文件中保留以下代码以解决此问题:

breeze.DataType.parseDateFromServer = function (source) {
                if (typeof source === 'string') {
                    //Check for local offset time or UTC time from server
                    if (source.slice(-1) !== "Z") {
                        var oldSource = source;

                        try {
                            source = source.substring(0, source.lastIndexOf("-") - 1)
                            source = new Date(source);
                            var tzDifference = source.getTimezoneOffset();
                            //convert the offset to milliseconds, add to targetTime, and make a new Date
                            var offsetTime = new Date(source.getTime() + tzDifference * 60 * 1000);
                            return offsetTime;
                        }
                        catch (err) {
                            source = new Date(source);
                            return source;
                        }
                    }
                    else {
                        source = new Date(source);

                        var tzDifference = source.getTimezoneOffset();
                        //convert the offset to milliseconds, add to targetTime, and make a new Date
                        var offsetTime = new Date(source.getTime() + tzDifference * 60 * 1000);

                        return offsetTime;
                    }
                }
            }

Jay:当我在控制台上打印我得到的源和输出时,我已经尝试实现了上述功能:2015-11-08T12:30:00.000Z->2015-11-08T12:30:00+00:00。我以以下方式使用矩库:矩.utc(source.format();。然而,稍后当我查询充满数据的实体时,它似乎被放回了本地时区。这是预期的行为吗?实体正在存储:GMT+0200(南非标准时间)。抱歉,还有一件事要补充-时间自然不正确,因为它有2个小时的差异。7小时调试breezejs的日期比较代码,最终发现问题的最大部分是因为Safari无法将
2017-02-12 21:00:00.000Z
作为日期处理,breezejs以静默方式将
无效日期转换为
null
,使用momentjs解决方案修复您是否必须在breeze代码本身中更改此项,或者是否有一个全局覆盖的钩子?以及如何从客户端返回到服务器…希望日期保持原样…无时区。。