2017-04-05 63 views
0

后重复datetime值我试图在一个数据表,以显示一些DATATIME值,这里是示例代码浏览器显示DST变化

<html> 
    <head> 
    <script type="text/javascript"> 
     console.log(new Date(2017,2,26,0,0,0)); 
     console.log(new Date(2017,2,26,1,0,0)); 
     console.log(new Date(2017,2,26,2,0,0)); 
     console.log(new Date(2017,2,26,3,0,0)); 
    </script> 
    </head> 
    <body> 
    </body> 
</html> 

浏览器显示为上午02点重复值。 这里是日志输出

Sun Mar 26 2017 00:00:00 GMT+0000 (GMT Standard Time) 
Sun Mar 26 2017 02:00:00 GMT+0100 (GMT Daylight Time) 
Sun Mar 26 2017 02:00:00 GMT+0100 (GMT Daylight Time) **(Should it not be 3am)** 
Sun Mar 26 2017 03:00:00 GMT+0100 (GMT Daylight Time) **(Should it not be 4am)** 

我知道我可以使用Date.UTC()

console.log(new Date(Date.UTC(2017,2,26,0,0,0))); 
console.log(new Date(Date.UTC(2017,2,26,1,0,0))); 
console.log(new Date(Date.UTC(2017,2,26,2,0,0))); 
console.log(new Date(Date.UTC(2017,2,26,3,0,0))); 

但是,这将显示其他时区错误日期时间值。 有人可以建议解决这个问题?或者有人可以解释这里发生了什么......?

+3

这很可能是因为“2017年3月26日上午1点”不存在。通过向前移动时钟,可以跳过整个小时。所以当你从JavaScript引擎请求这段时间时,它会通过向前移动一小时来“纠正”它,因为那是发生在那个小时的事情。这就是为什么,而不是操纵日期部分,你应该使用时间戳。按时间间隔增加时间戳,查看最终的日期/时间。 –

+1

我会使用unix时间戳(UTC),进行所有计算,然后将其放入适当的时区。正如@NiettheDarkAbsol指出的那样,你看到的输出是可以预料的。 –

+0

我没有看到一个会徽。在格林尼治标准时间+ 1日期实际上由于夏令时和@NiettheDarkAbsol是绝对正确的。 。你想要表达什么?坚持简单的规则:在timestamp/utc中创建和操作datetime,然后显示在任何正确的区域。 – Peter

回答

-2

如果你可以使用库,我强烈建议你使用MomentJS,它会让你的生活更轻松。

console.log(moment("2017-02-26 00:00:00").format()); 
console.log(moment("2017-02-26 01:00:00").format()); 
console.log(moment("2017-02-26 02:00:00").format()); 
console.log(moment("2017-02-26 03:00:00").format()); 
1

此行为取决于当前在您的计算机上设置好时区参加夏令时Does Everyone Observe Daylight Saving Time?

如果你切换语言环境冰岛的时区,例如,(UTC+00:00) Monrovia, Rejkjavik和执行代码在控制台:

new Date(2017,2,26,0,0,0) 
new Date(2017,2,26,1,0,0) 
new Date(2017,2,26,2,0,0) 
new Date(2017,2,26,3,0,0) 

你会看到被观察到的所有小时输出:

Sun Mar 26 2017 00:00:00 GMT+0000 (Greenwich Standard Time) 
Sun Mar 26 2017 01:00:00 GMT+0000 (Greenwich Standard Time) 
Sun Mar 26 2017 02:00:00 GMT+0000 (Greenwich Standard Time) 
Sun Mar 26 2017 03:00:00 GMT+0000 (Greenwich Standard Time) 

对于参与夏令时的国家/地区,我们将根据他们的时区丢失。

您也可以查看(UTC+10:00) Brisbane,澳大利亚,你会发现从3月27日午夜26时至27日午夜的所有时间均正确显示。

+1

这是正确的...我已经测试过不同的时区...正如@NiettheDarkAbsol所说,在英国夏令时“2017-03-26 01:00:00”不存在,所以JavaScript引擎“纠正”它通过将它向前移动一小时而不是抛出异常。 Javascript对我很有礼貌:D –

+0

没错,我错过了第一条评论:) –