计算两个日期之间的天数Y / m / d返回错误的数字

时间:2017-11-15 15:03:47

标签: javascript

我正在计算两个日期之间的日子。如果两个日期都在同一个月,那就顺利了,但如果两个日期不同则不顺利。 这是一个返回正确数字(1天)的例子:

var oneDay = 24*60*60*1000;
var firstDate = new Date(2017,11,29);
var secondDate = new Date(2017,11,30);
var diffDays = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
console.log(diffDays);

这是另一个例子。在这种情况下,计算十一月的最后一天和十二月的第一天之间的天数,应该是1但是返回2

var oneDay = 24*60*60*1000; 
var firstDate = new Date(2017,11,30);
var secondDate = new Date(2017,12,1);
var diffDays = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
console.log(diffDays);

我观察到,如果月份不同,如果一个或两个月符合少于31天,则返回错误的数字,它会增加少于31个月的缺失天数。这个案例1因为11月有30天而12月31日有1 + 1(缺少天数)= 2。 任何关于如何做到正确的想法都非常受欢迎。

3 个答案:

答案 0 :(得分:2)

使用new Date(year, month, date)创建日期时,请注意month参数从0开始,而不是从1开始。详细了解MDN: Date

因此,在您的第二个示例中,您计算​​的是2017年12月30日到2018年1月1日之间的日期,实际上是2天而不是1天。

答案 1 :(得分:2)

现在你的问题不是获得天数的方式(虽然由于闰秒,天数和令人困惑的时间,这可能会发生问题,请参阅:How do I get the number of days between two dates in JavaScript?)。

您的问题是您期望Date构造函数之外的行为不同。

Date构造函数使用0个索引月份,因此

var firstDate = new Date(2017,11,30); // 30th of december of 2017
var secondDate = new Date(2017,12,1); // 1st of January of 2018
// Second date is the 1st of january because it rolls over.

new Date(2016,0,1) // the 1st of January of 2016.

指的是12月30日和2018年1月1日,因此答案说他们之间的第31和第1,因此是2天。

答案 2 :(得分:-2)

您的舍入功能可能是导致此问题的原因。请尝试Math.floor向下舍入,这可能会解决您的问题。