对象 属性 自行打印后看起来不一样

Object property looking different after printing on it's own

我正在尝试使用 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 只是忽略了我的时区。我该如何解决?

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

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

您可能需要使用 getTimezoneOffset()

检查您的时区

Returns the time difference between UTC time and local time, in minutes

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

ts 不是 public 属性,您不应该使用它。 Luxon 在幕后使用各种技巧来正确计算。如果你想要时间戳,只需使用 date.toMillis()。如果你想要一个 JS 日期,使用 date.toJSDate().

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

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