假设巴西利亚 GMT -0300:夏令时于 21/10/2012 00:00:00,此时时钟应提前一小时
Java
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 中的结果我无法理解。我找到了这个post比约德说
This is an absolutely correct behavior
但没有解释为什么这种行为是可以的。
我的问题是:
为什么 JS 返回一小时前的日期?
附注我知道 Date 被标记为“弃用”,但我正在使用 GWT;日期是我唯一的选择。
最佳答案
基本上,据我所知,这个答案是不正确的。我什至对 Java 版本也不是完全满意。
从根本上来说,您正在尝试构建一个从未发生过的本地日期/时间。从本地时间转换为 UTC 总是很棘手,因为存在三种可能性:
- 明确的 map ,在大多数时区,每年只有两个小时除外
- 不明确的映射,在向后过渡期间,相同的本地时间段出现两次(例如本地时间为 12:59am、1am、...1:59am、1am、1:59am,凌晨 2 点)
- “间隙”映射,其中根本不存在本地时间段(例如本地时间为凌晨 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(在我非常有偏见的观点中)会迫使您说出在进行转换时您希望如何发生歧义和间隙。
关于java - 1° 夏令时 Java 和 JS 表现出不同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13048281/