文档似乎建议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