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

Pho*_*nix 4 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)
Run Code Online (Sandbox Code Playgroud)

它实际上增加了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;
} 
Run Code Online (Sandbox Code Playgroud)

这是输出:

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) 
Run Code Online (Sandbox Code Playgroud)

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

Dam*_*ack 7

它是每年四月/五月和九月,它给你一个不同的GMT抵消.那是夏令时.

来自维基百科:

1949年中国内战结束后,中华人民共和国为其所有领土建立了一个统一的时区-GMT + 8,称为北京时间(有时称为中国标准时间).从1986年到1991年观察到夏令时.

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

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