Javascript中的日期差异(忽略一天中的时间)

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

我正在写设备租赁申请,根据租赁期限(以天计),向客户收取设备租赁费用。所以,基本上(每日费用*天数)=总费用。

对于客户端的即时反馈,我试图用Javascript来计算两个日历日期的差异。我搜索了四周,但没有找到我正在寻找的东西。我见过的大多数解决方案都是这样形成的:

function dateDiff1(startDate, endDate) {
    return ((endDate.getTime() - startDate.getTime()) / 1000*60*60*24);
}

我的问题是,设备可以在这两个日期的任何时间检查出来并在任何时间返回,而且不收取额外费用。上面的代码是计算两个日期之间的24小时时间段的数量,当时我对日历天数很感兴趣。

例如,如果有人在7月6日上午6点检查了设备,并在7月7日晚上10点将其返回,上述代码会计算出超过一个24小时的时间已过,并且会返回2.期望的结果是1,因为只有一个日历日期已过(即第6日至第7日)。

我找到的最接近的解决方案是这个功能:

function dateDiff2(startDate, endDate) {
    return endDate.getDate() - startDate.getDate();
}

只要这两个日期在同一个月内,它就完全符合我的要求。但是,由于getDate()仅返回月中的某一天(即1-31),因此当日期跨越多个月时(例如7月31日至8月1日为1天,但上述计算1 - 31或-29)。

在后端,在PHP中,我使用了gregoriantojd(),这似乎工作得很好(请参阅本文中的示例)。我无法在Javascript中找到等效的解决方案。

有人有主意吗?

提问于
用户回答回答于

function daysBetween(first, second) { // Copy date parts of the timestamps, discarding the time parts. var one = new Date(first.getFullYear(), first.getMonth(), first.getDate()); var two = new Date(second.getFullYear(), second.getMonth(), second.getDate()); // Do the math. var millisecondsPerDay = 1000 * 60 * 60 * 24; var millisBetween = two.getTime() - one.getTime(); var days = millisBetween / millisecondsPerDay; // Round down. return Math.floor(days); }

用户回答回答于

我刚刚遇到了这个问题,在找到这个问题后解决了问题,所以我回来发布这个问题。无论时间如何,这将获得总天数。DST不会搞砸了:

date1 = Date.UTC(date1.getFullYear(), date1.getMonth(), date1.getDate());
date2 = Date.UTC(date2.getFullYear(), date2.getMonth(), date2.getDate());
var ms = Math.abs(date1-date2);
return Math.floor(ms/1000/60/60/24); //floor should be unnecessary, but just in case

转换为UTC日期,甚至不知道原始日期的时间。

扫码关注云+社区