不一致的 getTimezoneOffset 结果

Inconsistent getTimezoneOffset results

本文关键字:结果 getTimezoneOffset 不一致      更新时间:2023-09-26

文档似乎建议getTimezoneOffset()总是返回当前语言环境的偏移量,而不考虑日期对象。但是我得到的结果不一致,我无法理解。

new Date().getTimezoneOffset()                             // -120
new Date("2015-03-10T15:48:05+01:00").getTimezoneOffset()  // -60
new Date("2015-03-10T15:48:05-04:00").getTimezoneOffset()  // -60

另外,有没有更好的方法可以从日期时间字符串中获取时区(也许带有 moment.js)?

> getTimezoneOffset 使用执行代码的计算机的时区设置,返回调用它Date对象所表示的特定时刻的偏移量。

由于许多时区会更改其夏令时的偏移量,因此不同日期和时间的值不同是完全正常的。 当你在new Date()上调用它时,你会得到当前的偏移量。

与以 [+/-]HH:mm 格式返回的更常见的偏移量(UTC 以东)相比,从 getTimezoneOffset 返回的值以 UTC 以西的分钟为单位。 因此,您指定的时区在 UTC+1 和 UTC+2 之间交替。 我的猜测是,提供此输出的计算机位于使用中欧时间的区域之一 - 尽管它可能是其他几个区域之一。

此外,当您将偏移量作为ISO8601格式字符串的一部分传入时,该偏移量确实会被考虑在内 - 但仅在解析期间。 应用偏移量,并且Date对象在内部保留 UTC 时间戳。 然后,它会忘记有关您提供的偏移量的任何内容。 在输出时,某些函数将显式使用 UTC,但大多数函数将在发出结果之前转换为本地时区。

您还询问了如何使用 moment.js 获取日期时间字符串的偏移量。 是的,这很简单:

// Create a moment object.
// Use the parseZone function to retain the zone provided.
var m = moment.parseZone('2015-03-10T15:48:05-04:00');
// get the offset in minutes EAST of UTC (opposite of getTimezoneOffset)
var offset = m.utcOffset(); // -240
// alternatively, get it as a string in [+/-]HH:mm format
var offsetString = m.format("Z");  // "-04:00"

这是因为夏令时。对于您的时区,6 月 11 日为 UTC+2,3 月 10 日为 UTC+1:

// when in DST (since it's June)
new Date("2015-06-11T00:00:00Z").getTimezoneOffset();       // -120
// when not in DST
new Date("2015-03-10T15:48:05+01:00").getTimezoneOffset();  // -60

对我来说,由于我在东部时区,会发生以下情况:

// when in EST
new Date("2015-03-01T00:00:00Z").getTimezoneOffset();       // 300
// when in EDT
new Date("2015-06-01T00:00:00Z").getTimezoneOffset();       // 240