我必须计算两个日期之间经过了多少年。我的代码工作正常 - 除了非常具体的日期。
下面的代码应该为 dateEnd
和 dateEnd1
产生相同的年份差异,但它们并不相等。如果我将年份从 2003 年更改为 2004 年,它将变得相等。如果我离开年份,但从三月改为二月,它又会相等。
我想这与闰年有关,但我不知道为什么?尤其是那个时期有4个闰年,但是对于相差仅一天的日期,年份会出现误算。
在这两种情况下,我预计年份差异为 12,但是在第一种情况下,我使用 dateEnd
变量得到 13
var dateStart = '2003,03,11';
var dateEnd = '2016,03,10';
var dateEnd1 = '2016,03,09';
var difference = (new Date(dateEnd)).getTime() - (new Date(dateStart)).getTime();
difference = (new Date(difference)).getFullYear() - 1970;
alert('Between ' + dateStart + ' and ' + dateEnd + ' elapsed ' + difference + ' years.');
difference = (new Date(dateEnd1)).getTime() - (new Date(dateStart)).getTime();
difference = (new Date(difference)).getFullYear() - 1970;
alert('Between ' + dateStart + ' and ' + dateEnd1 + ' elapsed ' + difference + ' years.');
这是 jsfiddle 上的代码.评论中的一个人设法在他的 jsfiddle 上重现了这个问题。 !
这是我得到的变量值
dateStart time: 1047337200000
dateEnd time: 1457564400000
dateEnd1 time: 1457478000000
Time difference for the first case: 410227200000
Between 2003,03,11 and 2016,03,10 elapsed 13 years.
Time difference for the second case: 410140800000
Between 2003,03,11 and 2016,03,09 elapsed 12 years.
最佳答案
可以/不能重现的区别不是语言环境,而是时区。对我(在加利福尼亚州)而言,上述值给出:
alert(new Date(410140800000)); // "Thu Dec 30 1982 16:00:00 GMT-0800 (Pacific Standard Time)"
alert(new Date(410227200000)); // "Fri Dec 31 1982 16:00:00 GMT-0800 (Pacific Standard Time)"
如果我在格林威治标准时间或以东,第二个日期将是“1983 年 1 月 1 日星期六...”,给出不同的年数。闰年可能会进入其中,因为闰年的数量会影响差异中的天数。
我以为如果您使用 2005/2018,您会看到同样的结果,但正如 Arjan 指出的那样,它并不是那么简单,而且确实涉及闰年。
关于javascript - 日期计算的奇怪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15579364/