为什么这些日期setDate(day + 1)没有添加24小时?

时间:2014-01-21 03:58:17

标签: javascript

[如果没有明确说明问题,请帮我改进标题]


当我开发一个jquery插件时,我发现这个奇怪的事情:

var a = new Date('1986-05-03');
a.setHours(0,0,0,0);
// a = Sat May 03 1986 00:00:00 GMT+0800 (CST)

a.setDate( a.getDate() + 1 );
// a = Sat May 03 1986 23:00:00 GMT+0800 (CST)

实际上增加了23个小时

还有其他一些提到夏令时的门票,但是5月3日不是夏令时的开始,对吗?

此外,我尝试打印所有非24小时的日期,这是我的代码:

var start = new Date('1900-01-01'); // FYI, IE8- doesn't support this kind of date construction
var end = new Date('2014-01-01');
start.setHours(0,0,0,0);
end.setHours(0,0,0,0);

while (start.getTime() < end.getTime()) {
    var oneMoreDay = new Date(start.getTime()); 
    oneMoreDay.setDate(start.getDate() + 1);
    var diff = oneMoreDay.getTime() - start.getTime();
    if (diff != 86400000) {
        console.log(start);
    }
    start = oneMoreDay;
} 

这是输出:

Sat May 03 1986 23:00:00 GMT+0800 (CST) VM124:12
Fri Sep 12 1986 23:00:00 GMT+0900 (CST) VM124:12
Sat Apr 11 1987 23:00:00 GMT+0800 (CST) VM124:12
Fri Sep 11 1987 23:00:00 GMT+0900 (CST) VM124:12
Sat Apr 09 1988 23:00:00 GMT+0800 (CST) VM124:12
Fri Sep 09 1988 23:00:00 GMT+0900 (CST) VM124:12
Sat Apr 15 1989 23:00:00 GMT+0800 (CST) VM124:12
Fri Sep 15 1989 23:00:00 GMT+0900 (CST) VM124:12
Sat Apr 14 1990 23:00:00 GMT+0800 (CST) VM124:12
Fri Sep 14 1990 23:00:00 GMT+0900 (CST) VM124:12
Sat Apr 13 1991 23:00:00 GMT+0800 (CST) VM124:12
Fri Sep 13 1991 23:00:00 GMT+0900 (CST) 

所以,它不是每年都有!为什么这些日期特别?

2 个答案:

答案 0 :(得分:7)

每年4月/ 5月和9月,它会为您提供不同的GMT抵消。这是夏令时。

From Wikipedia:

  

中国内战后,1949年统一时区-GMT + 8-   由中华民国成立的所有领土,   叫北京时间(有时称为中国标准时间)。   从1986年到1991年观察到夏令时。

这不是问题。时间是对的。时间偏移只会改变。忽略它,所有计算都将正常工作。

P.S。这是我第一次研究中国内战的堆栈溢出。

答案 1 :(得分:0)

在当地时区使用夏令时日历的每年两天(开始和结束)。

仅在1986年至1991年间在中国观察夏令时,所以我在中国时区运行了代码我得到了上述结果。

但如果我将时区改为伦敦时间,我会得到不同的输出,几乎每年都有两天,即三月和十月。

您可以在不同的时区运行该代码以查看差异。