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

Why does JavaScript Date.getTimezoneOffset() consider “-05:00” as a positive offset?

我注意到,对于我们来说,时区偏移量为" -05:00"的东部时区(" America / New_York")Date.getTimezoneOffset()返回正数300。我希望以分钟为单位的偏移量在以 从Utc到西部,并且在Utc的东部地区是积极的,但显然是"失败的"。 这个决定背后的原因是什么?

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

1
2
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/在设置其初始"时区"参数时不会翻转数字。 这是错的吗?


因为这就是它的定义方式。引用文档(MDN):

The time-zone offset is the difference, in minutes, between UTC and
local time. Note that this means that the offset is positive if the
local timezone is behind UTC and negative if it is ahead.


详细说明Raina77ow的完全可接受的答案...

首先,要了解这里涉及的主要标准是ISO 8601和RFC 822(及其相对名称733、1123和2822),它们全部(部分)源于ANSI X3.51-1975。

所有这些标准都使用以下约定:正值位于UTC / GMT的东部,负值位于UTC / GMT的西部。

我知道的唯一可以逆转的标准是POSIX(请参见时区标签wiki的POSIX部分,以及本文),从而解释了为何向后兼容的Olson时区(例如" Etc / GMT + 5")具有标志倒置。 (当然,可能还有其他用法,我只是不知道它们。)

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

只能推测为什么存在这种不一致。 ECMAScript规范充满了这样的问题。可能是因为当您在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的值有点奇怪。确实,您不应以任何一种方式向用户公开偏移量(IMHO)。使用时区选择器控件(例如此控件或该控件)会更好。