为什么JavaScript Date.getTimezoneOffset()将“-05:00”视为正偏移量?

时间:2014-01-13 22:14:25

标签: javascript timezone datetimepicker momentjs timezone-offset

我注意到我们在东部时区(“America / New_York”)的时区偏移“ - 05:00” Date.getTimezoneOffset()返回正面数量为300.我预计在Utc的西部地区,以分钟为单位的偏差为负,在Utc以东的地区为负,但显然它是“翻转”。这个决定背后的原因是什么?

http://momentjs.com/遵循相同的规则并返回...

moment.parseZone("01/13/2014 3:38:00 PM +01:00").zone()   // == -60
moment.parseZone("01/13/2014 3:38:00 PM -01:00").zone()   // == 60

同时DateTimePicker http://trentrichardson.com/examples/timepicker/在设置其初始“timezone”参数时不会翻转数字。这是错的吗?

2 个答案:

答案 0 :(得分:62)

因为它是如何定义的。引用文档(MDN):

  

时区偏移是UTC和之间的差异,以分钟为单位   当地时间。请注意,这意味着偏移量为正值   当地时区落后于UTC,如果提前,则为负时

答案 1 :(得分:13)

在raina77ow上详细阐述了一个完全可以接受的答案......

首先,要了解此处涉及的主要标准是ISO 8601RFC 822(及其亲属7331123& 2822), all(in-part)派生自ANSI X3.51-1975。

所有这些标准都使用正值为UTC / GMT以东的惯例,负值为UTC / GMT以西。

我所知道的唯一标准是POSIX(参见the timezone tag wiki的POSIX部分和this article),从而解释了为什么向后兼容的Olson时区如“Etc” / GMT + 5“他们的标志被倒置了。 (当然有可能还有其他用法,我只是没有意识到它们。)

信不信由你,JavaScript做到了两种方式。当用作字符串(在RFC 822或ISO 8601语法中)时,它使用UTC的正偏移 East 的小时和分钟。但是当在getTimezoneOffset()对象上调用Date方法时,它会返回UTC的正 West 的整个分钟。

人们只能推测为什么存在这种不一致。 ECMAScript spec充满了这样的问题。也许是因为当您在ISO 8601或RFC 822字符串中看到偏移量时,该偏移量已经已经应用。但是,当您致电getTimezoneOffset()时, 的偏移量适用于将其恢复为UTC。

例如,2014-01-01T00:00:00-05:00等于2014-01-01T05:00:00Z。因此getTimezoneOffset()将返回300。如果您将300分钟添加到原始值,则会返回UTC。

这是同一枚硬币的两面。见

关于该具体控制是否不正确,我不确定。我不熟悉那个特定的控件。我在他们的文档中看到-0400等于-240的例子,其中一个可能会被反转,但是再次向用户提供像-240这样的值有点奇怪。实际上,你不应该向用户公开偏移量(恕我直言)。您最好使用时区选择器控件,例如this onethis one