new Date().getTimezoneOffset() 和 new Date(string).getTimezoneOffset() 有什么区别?

What is the difference between new Date().getTimezoneOffset() and new Date(string).getTimezoneOffset()?

我最近注意到这两个值在某些日期是不同的。

例如,两者的输出对于 04/01/2020 相同,但对于 03/01/2020 不同。

console.log(
  new Date("2020/03/01").getTimezoneOffset(), //-210
  new Date().getTimezoneOffset(),             //-270
);

console.log(
  new Date("2020/04/01").getTimezoneOffset(), //-270
  new Date().getTimezoneOffset(),             //-270
);

我今年所有月份都做了这个测试,结果是:

getTimezoneOffset 函数 returns 本地时区与 UTC 的偏移量,适用于您调用它的 Date object 实例所代表的时刻上。

  • 如果您在 new Date() 上调用它,您要求的是 当前 偏移量,因为默认构造函数设置 Date object 的时间戳到当前值,同样由 Date.now().

    给出
  • 如果您在 new Date(value) 上调用它,您要求的是适用于该值表示的时刻的偏移量。

时区偏差不是固定的,而是由政府制定的,可以很容易地改变。它们发生变化的一个原因是夏令时 (DST),该时间可能适用于也可能不适用于一年中部分时间的给定时区。它们可能会更改的其他原因是由于政府政策围绕修改 DST 的遵守、DST 的开始和停止日期或时间,或者 标准 时间偏移的更改。由于这些变化会产生历史差异,因此当您使用 getTimezoneOffset.

请求与 UTC 的偏移量时,有必要知道您询问的是哪个时间点

您可以在 the timezone tag wiki 中标题为 “时区!= 偏移量” 的部分阅读更多相关信息。

另一件事 - 您为字符串 ("2020/03/01") 提供的格式是 non-standard。给定的 JavaScript 引擎可能支持也可能不支持,但它不是规范的一部分。相反,您应该使用 "2020-03-01"(如果您指的是该日期的午夜 UTC)或 "2020-03-01T00:00:00"(如果您指的是该日期的午夜当地时间)。