2

假设巴西利亚 GMT -0300:DST 于 2012 年 10 月 21 日 00:00:00,此时时钟应提前一小时

爪哇

new Date(2012 - 1900, 9, 21, 0, 0, 0)
Sun Oct 21 01:00:00 BRST 2012

Chrome/FireFox(控制台)

new Date(2012, 9, 21, 0, 0 ,0)
Sat Oct 20 2012 23:00:00 GMT-0300 (Hora oficial do Brasil)

Java 中的结果是我所期望的,但 JS 中的结果我无法理解。我在 bjornd 说的地方找到了这篇文章

这是一个绝对正确的行为

但没有解释为什么这种行为是可以的。

我的问题是:

为什么 JS 会返回一小时前的日期?

PS 我知道日期标记为“弃用”,但我使用的是 GWT;日期是我唯一的选择。

4

1 回答 1

2

基本上,据我所知,这个答案是不正确的。我什至对 Java 版本并不完全满意。

从根本上说,您正在尝试构建一个从未发生过的本地日期/时间。从本地时间转换为 UTC 总是很棘手,因为存在三种可能性:

  • 明确的映射,在大多数时区,每年只有两个小时以外的所有时间都是如此
  • 模糊映射,在向后转换期间,相同的本地时间段出现两次(例如,本地时间变为 12:59am、1am、... 1:59am、1am、1:59am、2am)
  • “间隙”映射,本地时间段根本不存在(例如,本地时间为上午 12:59、凌晨 2 点、凌晨 2:01)

巴西在午夜将时钟向前移动,因此当地时间实际上是:

October 20th 11:58pm
October 20th 11:59pm
October 21st 01:00am
October 21st 01:01am

您要求的当地时间根本没有发生。看起来 Java 只是假设您想将其向前滚动...而 JavaScript 变得混乱:( 如果您在 2013 年 2 月 16 日开始时要求午夜,JavaScript 结果会更容易理解(但仍然不正确),因为例如 - 时钟会回到 15 日晚上 11 点。16 日上午 12 点是明确的,因为它只能在 15 日晚上 11 点至晚上 11:59 的“第二个”之后发生。

一个好的日期/时间 API(在我非常偏颇的观点中)会迫使您说出您希望在进行转换时如何发生歧义和差距。

于 2012-10-24T11:37:51.247 回答