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

uda*_*aya 262 html javascript date

  1. 我正在计算'从'到'到'日期之间的天数.例如,如果起始日期是13/04/2010,并且截止日期是15/04/2010,则结果应为

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

Max*_*xVT 508

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));
Run Code Online (Sandbox Code Playgroud)

  • 警告:并非所有日子都是24小时.如果您的日期范围跨越夏令时变化,您将失去或获得一小时(通常).对结果使用Math.round()(避免使用floor或ceil). (65认同)
  • @Mark关于使用Math.round的评论被添加到答案的代码中.不要像我认识的人那样再次舍入结果......(好吧,这就是我) (14认同)
  • 请注意,此代码仍会考虑计数时给定日期的TIME.即检查1日下午3点至2日00:00:00之间的天数将产生零天.要解决此问题,请在比较前将两个日期设置为午夜,即添加:firstDate.setHours(0,0,0); secondDate.setHours(0,0,0); 这样你可以说daysBetween(新日期(2016,1,10,15),新日期(2016,1,11))); 仍然拿出1天的差异. (13认同)
  • 事实上我在这里会让Math.ceil感到不安,因为即使剩下2.01天,说剩下3天就更有意义了. (9认同)
  • 我在2015-02-1到2015-03-01进行了测试,得到了31天.这里有什么问题...编辑:好的是啊... javascript月份是0-12所以如果你从jquery日期选择器或常规正常日期获得输入,则从月份中减去1 (3认同)
  • 很好,它让我一度认为 JavaScript 将一月设为 0,所以我认为 1 是一月,但实际上是二月,我的计算结果被忽略了。感谢这个结果。 (2认同)

Dar*_*rov 44

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

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);

}
Run Code Online (Sandbox Code Playgroud)

  • 避免使用地板,因为如果由于夏令时,范围内的一天较短,则会产生错误的结果. (10认同)

小智 17

这是我使用的.如果您只是减去日期,它将无法在夏令时间界限内工作(例如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;
Run Code Online (Sandbox Code Playgroud)

  • 但如果你放弃了时间等,为什么还要使用 UTC? (2认同)
  • @RuudLenders 因为 UTC 中的一天总是持续 24 小时,与其他时间格式不同,所以除以 24 小时是安全的 (2认同)

And*_*ich 11

这是我的实现:

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

+<date>确实的类型强制到整数表示,并且具有相同的效果<date>.getTime()8.64e7是在一天的毫秒数.

  • 2019 年读者:如果您使用的是 typescript,则需要“+”。 (4认同)
  • 类型强制在这里是多余的,因为您已经使用算术运算符来减去日期(这也导致类型强制).所以你可以这样写:`Math.round(Math.abs(one - another)/ 8.64e7);` (3认同)

Dam*_*ter 10

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

  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;
}
Run Code Online (Sandbox Code Playgroud)

  • 无需调整时区偏移,时间值采用 UTC。如果需要调整时区,可以使用 setMinutes() 直接应用于分钟,而不是转换为小时并使用 setHours() 。“set”方法的参数应该是整数。如果使用 setHours 并且偏移量不是小时的偶数倍,则该值将被截断。 (2认同)

Arm*_*min 8

我已经为另一个帖子写了这个解决方案,他们问,如何计算两个日期之间的差异,所以我分享了我准备的内容:

// Here are the two dates to compare
var date1 = '2011-12-24';
var date2 = '2012-01-01';

// First we split the values to arrays date1[0] is the year, [1] the month and [2] the day
date1 = date1.split('-');
date2 = date2.split('-');

// Now we convert the array to a Date object, which has several helpful methods
date1 = new Date(date1[0], date1[1], date1[2]);
date2 = new Date(date2[0], date2[1], date2[2]);

// We use the getTime() method and get the unixtime (in milliseconds, but we want seconds, therefore we divide it through 1000)
date1_unixtime = parseInt(date1.getTime() / 1000);
date2_unixtime = parseInt(date2.getTime() / 1000);

// This is the calculated difference in seconds
var timeDifference = date2_unixtime - date1_unixtime;

// in Hours
var timeDifferenceInHours = timeDifference / 60 / 60;

// and finaly, in days :)
var timeDifferenceInDays = timeDifferenceInHours  / 24;

alert(timeDifferenceInDays);
Run Code Online (Sandbox Code Playgroud)

您可以跳过代码中的一些步骤,我已编写它以便于理解.

你会在这里找到一个运行的例子:http://jsfiddle.net/matKX/

  • 请注意,月份是零索引,所以你应该有`new Date(date1 [0], - date1 [1],date1 [2]);`.此外,使用`parseInt`将截断毫秒.更简单地只是减去日期对象并将差异转换为天:`Math.round((date1 - date2)/ 8.64e7)`或者如果需要整天没有舍入,只需截断小数部分:`(date1 - date2 )/ 8.64e7 | 0`. (3认同)