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.
-
正确,时区偏移是相对于本地的。例如,如果您住在-01:00区域,那么UTC比您早60分钟,即+60。
-
我心中的问题是,为什么他们如此设计它。
-
@Andy-因为javascript Date对象是Java date对象,疣和所有对象(甚至是2位数的getYear方法)的副本。
-
@RobG嘿,证实了我很久以来一直想知道的事情!
-
要解决这个问题,只需将结果乘以减号(-)。这样,您将获得想要的东西。
-
获得您期望的偏移量的最简单方法是new Date().getTimezoneOffset()-60) .. easy peasy。这将返回人们通常期望的偏移量(以小时为单位,如您期望的那样带有负数)
详细说明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)。使用时区选择器控件(例如此控件或该控件)会更好。
-
马特,令我感到惊讶的是,《野田时报》的胶印结构没有遵循这些标准。文档说:"正值表示本地时间早于UTC(例如对于欧洲);负值表示本地时间晚于UTC(例如对于美国)。" nodatime.org/1.1.x/api/html/T_NodaTime_Offset.htm我刚刚收到一个错误报告,因为我认为这样做的相反。
-
我还使用了Moment.js,并比较了Moment.parseZone()。zone()从字符串中解析出的偏移量(正如我们在另一篇goo.gl/9EaxG5中与您讨论的那样)与Noda Time返回的偏移量相比,有点混乱。
-
@vkelman-我不确定你在干什么。野田做正确的事。它唯一的JavaScript getTimeZoneOffset被倒置。 Moment处理两种形式,当传递数字时使用JSs方式(向西正),或当作为字符串传递时使用ISO方式(向西正向)。请参阅此部分文档
-
但是在Noda Time中,当您使用Offset..Milliseconds /(60000)来获取偏移分钟数(一个数字)时,对于UTC以西的区域是负数。对于同一区域,给定正确格式的DateTimeZone字符串以创建Moment并使用Moment.parseZone()。zone()获得正分钟数。我认为Noda TimeOffset.Milliseconds()的正确(但令人困惑)是将返回UTC以西地区的正数。
-
最好在Noda Time小组中对此进行最好的讨论,但是我不会说Moment所做的或多或少都比Noda正确,因为Noda只是受到了不同来源的影响。
-
现在,我想一想,如果2014-01-01T00:00:00-05:00的意思是减去五个小时以获取实时时间,那会更好一些:)
-
@Andy-这将要求弃用ISO8601以支持新标准,并以某种方式向每天使用该标准的数百万人传达您所指的标准。 xkcd.com/927
-
我不同意ECMAScript"双向执行"。当解析或格式化为ISO 8601或RFC 822格式的字符串时,它当然会使用这些标准的约定,否则内置的解析器和格式化程序将完全无用(而不是仅仅几乎没有用)。 ;-)