【问题标题】:breezejs: date is not set to the right time微风js:日期未设置为正确的时间
【发布时间】:2018-08-21 05:24:16
【问题描述】:

我注意到,如果从服务器返回的日期属性值为“2013-07-11T17:11:04.700”,那么微风会将值更改为 Thu Jul 11​​ 19:11:04 UTC+0200 2013 .

请注意,现在时间提前了 2 小时!

我在保存实体时已经遇到过这个问题,所以我必须使用 momentjs 显式转换我的日期属性:

 date.hours(date.hours() - moment().zone() / 60);

但现在似乎在进行读取操作时也会出现问题。

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

【问题讨论】:

    标签: date breeze


    【解决方案1】:

    Breeze 不会以任何方式操纵进出服务器的日期时间,除了将 UTZ 时区说明符添加到从服务器返回的任何日期中,而这些日期还没有时区说明符。这样做只是因为不同的浏览器会以不同的方式解释没有时区说明符的日期,并且我们希望浏览器之间保持一致。

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

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

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

    breeze.DataType.parseDateFromServer = function (source) {
         return new Date(Date.parse(source));
    };
    

    但是,这可能会遇到不同的浏览器以不同的方式解释没有时区偏移的 DateTime 字符串的问题......因此,根据浏览器的不同,您仍然可能会得到奇怪的结果。如果发生这种情况,您需要在上面的 sn-p 中添加一些浏览器检测代码。

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

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

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

    【讨论】:

    • Jay:当我将我得到的源和输出打印到控制台时,我尝试实现上述操作:2015-11-08T12:30:00.000Z-> 2015-11-08T12:30: 00+00:00。我以下列方式使用矩库:moment.utc(source).format();。但是后来当我查询填充了数据的实体时,它似乎又回到了本地时区。这是预期的行为吗?实体正在存储:GMT+0200(南非标准时间)。
    • 抱歉还要补充一件事 - 时间自然不正确,因为它有 2 小时的差异。
    • 最佳部分 7 小时调试breezejs 的日期比较代码最终发现问题是因为Safari 无法将2017-02-12 21:00:00.000Z 作为日期处理,Breezejs 默默地将Invalid Date 转换为null,使用momentjs解决方案
    • 您是否必须在微风代码本身中更改这一点,或者是否有一个挂钩可以在全局范围内覆盖?
    • 那么从客户端回到服务器呢...希望日期按原样...没有时区..
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2016-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-14
      相关资源
      最近更新 更多