编辑:这不是马丁指出的错误。我只是穿越夏令时,因此差一点。
我想计算“2010年3月29日”和“2010年3月9日”之间的天数差异,所以我有以下代码:
((new Date(2010, 2, 29)).getTime() - (new Date(2010, 2, 8)).getTime()) / 86400000
86400000是一天中的毫秒数,并且以毫秒为单位返回日期之间的差异,因此这应该有效。只是它并不完全。我得到了
20.958333333333332
这两个日期之间的区别是错误的。它应该是1814400000(21天86400000),但它实际上是1810800000。
此外,如果我改变差异:
((new Date(2010, 2, 28)).getTime() - (new Date(2010, 2, 7)).getTime()) / 86400000
同样的差异,只有一天回来,我得到了正常的结果。
只有当我们试图得到(x-y)x时,2010年3月29日之后,y出现在2010年3月29日之前,才会发生这种情况。
我在Mac上的Safari 4和Firefox 3.6以及Windows 7上的IE 8上都有这个。没有尝试过其他浏览器。
我做错了什么或这是一个已知的错误?
答案 0 :(得分:11)
你正在越过夏令时的边界,因此有1小时的差异。
答案 1 :(得分:2)
夏令时使日期算术变得棘手。这意味着每年363天是24小时,一天是25小时,一天只有23小时。我个人投票赞成取消夏令时。
在Java中,有一个GregorianCalendar类,尽管有DST,它仍能正确计算日期算术。我想这在Javascript中没什么用。
答案 2 :(得分:2)
(我看到你抓住了dst的变化)
任何javascript划分都容易出现浮点问题 - 设置你需要的'准确性'。
您不需要自己花时间--javascript会为您进行转换。
+((new Date(2010, 2, 29) - new Date(2010, 2, 8))/ 86400000).toFixed(2)
/ *返回值:(Number) 20.96(当地时间。可能是您想要的 - 否则,设置UTC日期部分) * /