2010-10-25 116 views
4

我看到一些行为,我不明白Javascript日期对象和DST转换。如果我执行在Chrome的JavaScript控制台以下Javascript日期对象和夏令时

var date = new Date(1268535600000); //2010-03-14T03:00:00.000Z (21:00 03-13 America/Chicago) 
for(var i = 1; i <= 12; i++) 
{ 
    var time = date.getHours(); 
    console.log(time) 
    console.log(date) 
    date.setHours(date.getHours() + 1);   
} 

输出为:

21 
Sat Mar 13 2010 21:00:00 GMT-0600 (Central Standard Time) 
22 
Sat Mar 13 2010 22:00:00 GMT-0600 (Central Standard Time) 
23 
Sat Mar 13 2010 23:00:00 GMT-0600 (Central Standard Time) 
0 
Sun Mar 14 2010 00:00:00 GMT-0600 (Central Standard Time) 
1 
Sun Mar 14 2010 01:00:00 GMT-0600 (Central Standard Time) 
1 
Sun Mar 14 2010 01:00:00 GMT-0600 (Central Standard Time) 
1 
Sun Mar 14 2010 01:00:00 GMT-0600 (Central Standard Time) 
1 
Sun Mar 14 2010 01:00:00 GMT-0600 (Central Standard Time) 
1 
Sun Mar 14 2010 01:00:00 GMT-0600 (Central Standard Time) 
1 
Sun Mar 14 2010 01:00:00 GMT-0600 (Central Standard Time) 
1 
Sun Mar 14 2010 01:00:00 GMT-0600 (Central Standard Time) 
1 
Sun Mar 14 2010 01:00:00 GMT-0600 (Central Standard Time) 

然而,改变的for循环的最后一行

date = new Date(date.getTime() + 3600000) 

产生输出I” d期望在转换时跳过小时:

21 
Sat Mar 13 2010 21:00:00 GMT-0600 (Central Standard Time) 
22 
Sat Mar 13 2010 22:00:00 GMT-0600 (Central Standard Time) 
23 
Sat Mar 13 2010 23:00:00 GMT-0600 (Central Standard Time) 
0 
Sun Mar 14 2010 00:00:00 GMT-0600 (Central Standard Time) 
1 
Sun Mar 14 2010 01:00:00 GMT-0600 (Central Standard Time) 
3 
Sun Mar 14 2010 03:00:00 GMT-0500 (Central Daylight Time) 
4 
Sun Mar 14 2010 04:00:00 GMT-0500 (Central Daylight Time) 
5 
Sun Mar 14 2010 05:00:00 GMT-0500 (Central Daylight Time) 
6 
Sun Mar 14 2010 06:00:00 GMT-0500 (Central Daylight Time) 
7 
Sun Mar 14 2010 07:00:00 GMT-0500 (Central Daylight Time) 
8 
Sun Mar 14 2010 08:00:00 GMT-0500 (Central Daylight Time) 
9 
Sun Mar 14 2010 09:00:00 GMT-0500 (Central Daylight Time) 

第一种方法不起作用的原因是什么?

编辑: 此外,用它似乎只是忽略复制小时与第一种方法复制的小时DST过渡: 的另一件事是,如果我尝试用一​​个重复小时DST过渡,它只是似乎忽略重复的小时:

Sun Nov 07 2010 00:00:00 GMT-0500 (Central Daylight Time) 
Sun Nov 07 2010 01:00:00 GMT-0600 (Central Standard Time) 
Sun Nov 07 2010 02:00:00 GMT-0600 (Central Standard Time) 

但它正确处理重复小时的第二种方法。

回答

1

也许这是一个错误。你是否在多个浏览器上尝试过它?

否则我会猜测,因为您试图将小时设置为不存在的时间,它会拒绝更改。

+0

是的,我在Firefox中使用Firebug作为控制台时得到了相同的行为。 – 2010-10-25 20:49:02

+0

我不确定是否仅仅是由于无效的时间,因为还有一些奇怪的与DST转换重复一小时(我更新了这个案例的问题) – 2010-10-25 20:52:32

+0

@你的新案件不会改变我的答案在所有。秋季过渡不包含任何无效时间,它只需加倍一个小时:01:00至01:59发生两次。有趣的是,它选择CST而不是保留CDT的先前值,但两种答案都是正确的。对于Spring转换,02:00到02:59不存在,因此在该时间间隔内设置时间将是一个错误。 – 2010-10-25 21:34:44