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

vke*_*man 45 javascript timezone datetimepicker timezone-offset momentjs

我注意到对于我们东部时区("America/New_York"),时区偏移量为"-05:00" Date.getTimezoneOffset()返回数300.我希望在几分钟内偏移量为负值来自Utc的West,以及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
Run Code Online (Sandbox Code Playgroud)

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

rai*_*7ow 71

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

时区偏移是UTC与本地时间之间的差异(以分钟为单位).请注意,这意味着如果本地时区落后于UTC,则偏移量为正,如果前置,则偏移量为负.

  • 我心中的问题是他们为什么这么设计它. (34认同)
  • 对,时区偏移量相对于本地.例如,如果您居住在-01:00区域,则UTC比您提前60分钟,或+60. (4认同)
  • @Andy——因为 javascript Date 对象是 Java 日期对象、warts 和所有(甚至是 2 位 *getYear* 方法)的副本。 (3认同)
  • @RobG 呵呵,这证实了我长期以来一直想知道的事情! (2认同)
  • 要解决这个问题,只需将结果乘以减号 (-) 即可。这样你就会得到你想要的。 (2认同)

Mat*_*int 15

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

首先,要明白的是,这里所涉及的主要标准是ISO 8601RFC 822(及其亲属733,11232822)的ANSI X3.51-1975衍生,这是所有(的部分).

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

我所知道的唯一标准就是POSIX(参见时区标签wiki的POSIX部分,以及本文),从而解释为什么向后兼容的Olson时区如"Etc/GMT + 5"有他们的标志倒置.(当然可能还有其他用法,我只是没有意识到它们.)

信不信由你,JavaScript做到了两种方式.当用作字符串(在RFC 822或ISO 8601语法中)时,它使用小时和分钟以及UTC 以东的正偏移.但是当getTimezoneOffset()Date对象上调用方法时,它返回整数分钟,这些分钟是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这样的值有点奇怪.实际上,您不应该向用户公开偏移量(恕我直言).你最好使用时区选择器控件,比如这个或者这个.