breezejs:日期未设置到正确的时间

时间:2013-07-15 15:05:14

标签: 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);

但现在看来,在进行读取操作时也会出现问题。

确保微风不会改变我日期属性值的最佳方法是什么?

2 个答案:

答案 0 :(得分:19)

Breeze 不会以任何方式操纵进出服务器的日期时间除了将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的行为更加清晰。

答案 1 :(得分:0)

默认情况下,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;
                    }
                }
            }