【问题标题】:Object property looking different after printing on it's own单独打印后的对象属性看起来不同
【发布时间】:2019-02-17 23:58:37
【问题描述】:

我正在尝试使用 luxon 使用时区生成新日期。这是我的代码:

var luxon = require('luxon');
luxon.Settings.defaultZoneName = 'UTC+4';
var date = luxon.DateTime.local();
console.log(date);
var now = new Date(date.ts);
console.log(now.toString());

这是控制台:

DateTime {
    ts: 2018-09-13T13:09:45.333+04:00,
        zone: UTC+4,
        locale: en-US }
Thu Sep 13 2018 11:09:45 GMT+0200 (CEST)

但如果我尝试像这样访问ts 属性

var date = luxon.DateTime.local();
console.log(date.ts); // here
var now = new Date(date.ts);
console.log(now.toString());

我在控制台中得到了这个:

1536830052009
Thu Sep 13 2018 11:14:12 GMT+0200 (CEST)

这是为什么呢?它是否在后台进行某种数学运算?事实证明,这个date.ts 只是忽略了我的时区。我该如何解决?

【问题讨论】:

    标签: javascript date time luxon


    【解决方案1】:

    首先1536830052009,这是你的时间,以毫秒为单位,

    new Date(1536830052009)
    // output Thu Sep 13 2018 11:14:12 GMT+0200 (CEST)
    

    您可能想使用getTimezoneOffset()检查您的时区

    返回UTC时间与本地时间的时差,以分钟为单位

    很多人用moment.js来玩Date,我知道这不是你的问题,但也许你能找到一些有用的东西

    【讨论】:

    • 是的。但问题是,与我的时间相比,我正试图将时间提前 4 小时。另外,如果在记录整个对象时,为什么在作为属性记录后会有所不同?
    • 这是因为2018-09-13T13:09:45.333+04:00是Date格式,尝试用Date(date.ts)进行投射,它会按预期输出
    • 与此有何不同? var now = new Date(date.ts);
    • 不一样,都是一样的
    • 这就是它令人困惑的原因。您发现我的代码有问题吗?
    【解决方案2】:

    ts 不是公共财产,您不应使用它。 Luxon 在幕后做了各种各样的把戏来正确计算。如果你想要时间戳,只需使用date.toMillis()。如果你想要一个 JS 日期,请使用date.toJSDate()

    另外两件重要的事情要知道:

    1. 它没有忽略您的区域。时区不会改变时间。它更像是关于影响我们显示方式的时间的元数据。 Luxon 文档cover this 有点。您不应该期望通过摆弄区域来提取不同的时间戳。现在就是现在。
    2. 请记住,本地 Date 对象不支持本地时区以外的时区。因此,无论何时您将 Luxon 对象转换为原生 Date,该信息都会丢失。时间本身是相同的(即表示相同的毫秒),但会以当地时间表示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-02
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-08
      • 1970-01-01
      相关资源
      最近更新 更多