假设巴西利亚GMT -0300:DST于21/10/2012 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中的结果我无法理解。我找到了这个post,其中bjornd说
这是绝对正确的行为
但没有解释为什么这种行为没问题。
我的问题是:
为什么JS过去会在一小时内返回日期?
P.S。我知道Date标记为“弃用”,但我使用的是GWT;日期是我唯一的选择。
答案 0 :(得分:2)
基本上,就我所见,这个答案是不正确的。我甚至对Java版本都不满意。
从根本上说,您正在尝试构建一个从未发生过的本地日期/时间。从本地时间转换为UTC总是很棘手,因为有三种可能性:
巴西在午夜将时钟推进,因此当地时间实际上是:
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(在我非常偏见的视图中)会强迫您说明在进行转换时您希望如何发生歧义和差距。