如何计算两个日期之间的天数?

IT技术 javascript html date
2021-01-18 15:38:01
  1. 我正在计算“从”和“到”日期之间的天数。例如,如果起始日期是 13/04/2010 而截止日期是 15/04/2010,结果应该是

  2. 如何使用 JavaScript 获得结果?

6个回答
const oneDay = 24 * 60 * 60 * 1000; // hours*minutes*seconds*milliseconds
const firstDate = new Date(2008, 1, 12);
const secondDate = new Date(2008, 1, 22);

const diffDays = Math.round(Math.abs((firstDate - secondDate) / oneDay));
事实上,我更喜欢在这里使用 Math.ceil,因为即使还剩 2.01 天,说还剩 3 天比说还剩 2 天更有意义。
2021-03-26 15:38:01
请注意,此代码在计数时仍会考虑给定日期的 TIME。即检查 1 号下午 3 点到 2 号 00:00:00 之间的天数将产生零天数。要解决此问题,请在比较之前将两个日期都设置为午夜,即添加: firstDate.setHours(0, 0, 0); secondDate.setHours(0, 0, 0); 这样你就可以说 daysBetween(new Date(2016,1,10,15), new Date(2016,1,11))); 并且仍然想出1天的差异。
2021-03-29 15:38:01
警告:并非所有的日子都是 24 小时。如果您的日期范围跨越夏令时更改,您将失去或增加一个小时(通常)。对结果使用 Math.round()(避免 floor 或 ceil)。
2021-03-31 15:38:01
我在 2015-02-1 到 2015-03-01 测试了这个,得到了 31 天。这里有问题... 编辑:好的,是的... javascript 月份是从 0 到 12,所以如果您从 jquery 日期选择器或常规正常日期获取输入,请从月份中减去 1
2021-04-05 15:38:01
@Mark 关于使用 Math.round 的评论已添加到答案代码中。不要再把结果四舍五入,就像我认识的人一样......(好吧是我)
2021-04-07 15:38:01

这是一个执行此操作的函数:

function days_between(date1, date2) {

    // The number of milliseconds in one day
    const ONE_DAY = 1000 * 60 * 60 * 24;

    // Calculate the difference in milliseconds
    const differenceMs = Math.abs(date1 - date2);

    // Convert back to days and return
    return Math.round(differenceMs / ONE_DAY);

}
用你的例子,1.5 天变成 2 天?改用 Math.floor
2021-03-17 15:38:01
避免使用地板,因为如果由于夏令时范围内的一天更短,它会给出错误的结果。
2021-03-31 15:38:01
为什么总是返回 Thu Jan 01 1970 08:00:00 GMT+0800(印度支那时间)?
2021-04-10 15:38:01

这是我使用的。如果您只是减去日期,则它不会跨越夏令时边界(例如,4 月 1 日至 4 月 30 日或 10 月 1 日至 10 月 31 日)。这会减少所有时间以确保您有一天并通过使用 UTC 消除任何 DST 问题。

var nDays = (    Date.UTC(EndDate.getFullYear(), EndDate.getMonth(), EndDate.getDate()) -
                 Date.UTC(StartDate.getFullYear(), StartDate.getMonth(), StartDate.getDate())) / 86400000;

作为一个函数:

function DaysBetween(StartDate, EndDate) {
  // The number of milliseconds in all UTC days (no DST)
  const oneDay = 1000 * 60 * 60 * 24;

  // A day in UTC always lasts 24 hours (unlike in other time formats)
  const start = Date.UTC(EndDate.getFullYear(), EndDate.getMonth(), EndDate.getDate());
  const end = Date.UTC(StartDate.getFullYear(), StartDate.getMonth(), StartDate.getDate());

  // so it's safe to divide by 24 hours
  return (start - end) / oneDay;
}
但是,如果您放弃工作时间等,您为什么还要使用 UTC?
2021-03-16 15:38:01
@RuudLenders 因为UTC中的一天总是持续24小时,与其他时间格式不同,所以除以24小时是安全的
2021-04-07 15:38:01

这是我的实现:

function daysBetween(one, another) {
  return Math.round(Math.abs((+one) - (+another))/8.64e7);
}

+<date>对整数表示进行类型强制,与<date>.getTime()8.64e7是一天中的毫秒数具有相同的效果

2019 读者:如果您使用的+typescript,则是必需的。
2021-03-16 15:38:01
类型强制在这里是多余的,因为您已经使用算术运算符来减去日期(这也会导致类型强制)。所以你可以这样写:Math.round(Math.abs(one - another) / 8.64e7);
2021-03-29 15:38:01

调整以允许夏令时差异。试试这个:

  function daysBetween(date1, date2) {

 // adjust diff for for daylight savings
 var hoursToAdjust = Math.abs(date1.getTimezoneOffset() /60) - Math.abs(date2.getTimezoneOffset() /60);
 // apply the tz offset
 date2.addHours(hoursToAdjust); 

    // The number of milliseconds in one day
    var ONE_DAY = 1000 * 60 * 60 * 24

    // Convert both dates to milliseconds
    var date1_ms = date1.getTime()
    var date2_ms = date2.getTime()

    // Calculate the difference in milliseconds
    var difference_ms = Math.abs(date1_ms - date2_ms)

    // Convert back to days and return
    return Math.round(difference_ms/ONE_DAY)

}

// you'll want this addHours function too 

Date.prototype.addHours= function(h){
    this.setHours(this.getHours()+h);
    return this;
}
不需要调整时区偏移,时间值是UTC。如果需要调整时区,可以直接应用于分钟setMinutes()而不是转换为小时并使用setHours()set方法的参数应该是整数。如果使用setHours且偏移量不是小时的偶数倍,则该值将被截断。
2021-03-26 15:38:01