1º夏令时日Java和JS显示不同的行为

时间:2012-10-24 11:26:19

标签: java javascript dst

假设巴西利亚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;日期是我唯一的选择。

1 个答案:

答案 0 :(得分:2)

基本上,就我所见,这个答案是不正确的。我甚至对Java版本都不满意。

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

  • 无歧义的映射,在大多数时区都是如此,但每年只有两个小时
  • 向后转换期间的模糊映射,其中相同的本地时间段发生两次(例如,当地时间是上午12:59,凌晨1点,......上午1:59,凌晨1点,凌晨1点59分,上午02点)
  • “差距”映射,其中当地时间段根本不存在(例如当地时间早上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(在我非常偏见的视图中)会强迫您说明在进行转换时您希望如何发生歧义和差距。