JavaScript 日期对象和夏令时

4

我看到了一些关于JavaScript日期对象和DST转换的行为,我不太理解。如果我在Chrome的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)   

在转换时跳过的那个小时,产生了我期望的输出:

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)

为什么第一种方法不起作用?

编辑: 此外,在夏令时转换中,如果有一个重复的小时,第一种方法似乎会忽略重复的小时: 另外一件事是,如果我尝试使用夏令时转换,其中有一个重复的小时,它似乎只会忽略重复的小时:

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个回答

1

也许这是一个bug。你尝试在多个浏览器上测试了吗?

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


是的,我在Firefox中使用Firebug作为控制台时得到了相同的行为。 - Will Gorman
我不确定这是否仅仅是由于无效时间造成的,因为在夏令时转换时也存在一些奇怪的情况,其中有一个小时重复(我已经在问题中更新了该情况)。 - Will Gorman
越想越觉得这种行为有道理。我想最好的做法是在UTC内部工作,仅在向用户显示数据时使用本地时间转换。真正让人困惑的是夏令时。 - aaaaaaaaaaaa
@电子商务,UTC(协调世界时)几乎总是最好的选择。它没有歧义并且单调。 - Mark Ransom
@Will,我认为Mark是正确的。我不认为这是一个错误,而是一个特性:你试图将一个Date对象显式设置为无效时间(因为在那个日期2:00:00到2:59:59不存在),并且你的Date对象没有被更改。如果你只是计算毫秒数,你总是处于有效的时间。 - Marcel Korpel
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接