我想知道如何计算两个日期之间的日历天。目前,我正在转换为时间戳并计算差异,因为这似乎是以下最常见的解决方案:
let time = 1561978969653;
let now = new Date();
let uploadDate = new Date(time);
let timeDiff = Math.abs(now.getTime() - uploadDate.getTime());
let days = Math.ceil(timeDiff / (1000 * 3600 * 24));
console.log(timeDiff, days);
但是,这有某些缺点。例如26/01/2019 @ 11:59:59
到27/01/2019 00:00:00
应该算作1个日历日,但是我使用的方法算作0,因为在两个时间戳之间没有整整24小时。>
我也曾考虑过要遍历日子并增加计数器,但这似乎效率低下和/或不够优雅。
编辑:我不想为此目的实现第三方库,我想要一个程序化的解决方案,同样,基于时间戳的方法也无法解决日期间隔短的问题。上面的问题。
答案 0 :(得分:1)
对绝对值使用Math.round来获取当天的下一个完整值。
function calculateDaysBetween(now, uploadDate) {
let timeDiff = Math.abs(now.getTime() - uploadDate.getTime());
return Math.round(Math.abs((timeDiff)/((24*60*60*1000))));
}
let now = new Date("Jan 27, 2019 00:00:00");
let uploadDate = new Date("Jan 26, 2019 11:59:59");
console.log(calculateDaysBetween(now, uploadDate)); // 1 Day
let now2 = new Date("Jun 01, 2019 00:00:00");
let now3 = new Date("Jun 01, 2019 00:01:00");
console.log(calculateDaysBetween(now2, now3)); // 0 Days
let now4 = new Date("Jun 10, 2019 10:00:59");
let now5 = new Date("Jun 15, 2019 11:59:00");
console.log(calculateDaysBetween(now4, now5)); // 5 Days
答案 1 :(得分:1)
阐述我在评论中的想法,如果您选择一个纪元日期,我们只计算每个日期相对于该纪元的天数。然后,我们只记录日差。这应该可以解决您在小时,分钟和秒上遇到的任何问题。选择适当的纪元日期以取消本地时区问题和夏时制问题:
function countDays(srcDate, dstDate) {
let epoch = new Date("2000-01-01 00:00:00")
let srcDays = Math.floor((srcDate.getTime() - epoch.getTime()) / 1000 / 60 / 60 / 24)
let dstDays = Math.floor((dstDate.getTime() - epoch.getTime()) / 1000 / 60 / 60 / 24)
let count = dstDays - srcDays
console.log("srcDate: ", srcDate)
console.log("dstDate: ", dstDate)
console.log("count: ", count)
return count
}
countDays(new Date("2019-01-26 23:59:59"), new Date("2019-01-27 00:00:00"))
countDays(new Date("2019-01-26 11:59:59"), new Date("2019-01-27 00:00:00"))
countDays(new Date(1561978969653), new Date())
答案 2 :(得分:0)
我建议使用setHours方法将开始和结束日期对象的小时,分钟,秒和毫秒设置为零(为您指定相关日期的开始时间),然后计算两者之间的差异。
方便地,setHours方法返回自1970年1月以来的毫秒数,与getTime方法相同,因此您也可以摆脱这些调用。
function diff(a,b) {
let timeDiff = Math.abs(a.setHours(0,0,0,0) - b.setHours(0,0,0,0));
let days = Math.round(timeDiff / (1000*3600*24));
console.log(a + " -> " + b + ": " + days + " days");
return days;
}
diff(new Date("Jun 01, 2019 23:59:00"), new Date("Jun 02, 2019 00:01:00"));