How to calculate the number of days between two dates?
本问题已经有最佳答案,请猛点这里访问。
我正在计算"从"和"到"日期之间的天数。例如,如果开始日期是2010年4月13日,结束日期是2010年4月15日,则结果应该是
如何使用javascript获得结果?
1 2 3 4 5 | var oneDay = 24*60*60*1000; // hours*minutes*seconds*milliseconds var firstDate = new Date(2008,01,12); var secondDate = new Date(2008,01,22); var diffDays = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay))); |
下面是一个函数,它执行以下操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | function days_between(date1, date2) { // 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); } |
这是我用的。如果您只减去日期,它将无法跨越夏令时边界(如4月1日至4月30日或10月1日至10月31日)。这会减少所有的时间,以确保您获得一天,并通过使用UTC消除任何DST问题。
1 2 | var nDays = ( Date.UTC(EndDate.getFullYear(), EndDate.getMonth(), EndDate.getDate()) - Date.UTC(StartDate.getFullYear(), StartDate.getMonth(), StartDate.getDate())) / 86400000; |
作为一个函数:
1 2 3 4 5 6 7 8 9 10 11 | 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; } |
以下是我的实现:
1 2 3 | function daysBetween(one, another) { return Math.round(Math.abs((+one) - (+another))/8.64e7); } |
根据日光节约差异进行调整。试试这个:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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; } |
我为另一个帖子写了这个解决方案,他问我如何计算两个日期之间的差异,所以我分享我准备的内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | // 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); |
您可以跳过代码中的一些步骤,我已经编写了这些步骤,以便于理解。
您可以在这里找到一个运行示例:http://jsfiddle.net/matkx/
从我的小日期差计算器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | var startDate = new Date(2000, 1-1, 1); // 2000-01-01 var endDate = new Date(); // Today // Calculate the difference of two dates in total days function diffDays(d1, d2) { var ndays; var tv1 = d1.valueOf(); // msec since 1970 var tv2 = d2.valueOf(); ndays = (tv2 - tv1) / 1000 / 86400; ndays = Math.round(ndays - 0.5); return ndays; } |
所以你可以打电话给:
1 | var nDays = diffDays(startDate, endDate); |
(完整来源:http://david.tribble.com/src/javascript/jstimespan.html。)
补遗
可以通过更改以下行来改进代码:
1 2 | var tv1 = d1.getTime(); // msec since 1970 var tv2 = d2.getTime(); |