2个日期之间的日历天

时间:2019-07-01 10:59:39

标签: javascript

我想知道如何计算两个日期之间的日历天。目前,我正在转换为时间戳并计算差异,因为这似乎是以下最常见的解决方案:

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:5927/01/2019 00:00:00应该算作1个日历日,但是我使用的方法算作0,因为在两个时间戳之间没有整整24小时。

我也曾考虑过要遍历日子并增加计数器,但这似乎效率低下和/或不够优雅。

编辑:我不想为此目的实现第三方库,我想要一个程序化的解决方案,同样,基于时间戳的方法也无法解决日期间隔短的问题。上面的问题。

3 个答案:

答案 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"));