【问题标题】:Javascript Date objects and Daylight Savings TimeJavascript 日期对象和夏令时
【发布时间】:2011-04-30 10:04:00
【问题描述】:

我看到一些我不理解的 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)

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

编辑: 此外,对于具有重复时间的 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)

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

【问题讨论】:

    标签: javascript date dst


    【解决方案1】:

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

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

    【讨论】:

    • 是的,我在使用 Firebug 作为控制台的 Firefox 中得到了相同的行为。
    • 我不确定这是否只是由于无效时间,因为重复小时的 DST 过渡也有些奇怪(我用这种情况更新了问题)
    • @Will,你的新案子根本不会改变我的答案。 Fall 过渡不包含任何无效时间,它只是增加了一小时:01:00 到 01:59 发生了两次。有趣的是它选择了 CST 而不是保留之前的 CDT 值,但两个答案都是正确的。对于 Spring 过渡,不存在 02:00 到 02:59,因此在该时间间隔内的任何位置设置时间都是错误的。
    • 我想得越多,这种行为就越有意义。我想最好的做法是在 UTC 内部工作,并将转换为本地时间仅用于向用户显示数据。真正的 WTF 是夏令时。
    • @eBusiness,UTC 几乎总是最好的答案。它是明确且单调的。
    猜你喜欢
    • 2012-06-01
    • 2023-04-05
    • 2012-12-21
    • 1970-01-01
    • 2012-07-09
    • 2012-04-07
    • 2015-12-23
    • 1970-01-01
    • 2014-06-27
    相关资源
    最近更新 更多