如何获取JavaScript中两个日期之间的天数?例如,在输入框中给定两个日期:

<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>

<script>
  alert(datediff("day", first, second)); // what goes here?
</script>


评论

用户询问“两个日期之间的天数”的案例中,有99%的她不理解的是,她试图将苹果与梨进行比较。如果问“日期范围中有多少个日期?”,或者我必须在日历上跨越多少个正方形,问题就变得如此简单。这样就省去了时间和夏时制等问题。由于日期时间数据结构纯粹是胡说八道,这给我们带来了混乱。没有日期时间,没有日期,没有时间,这两个对象在本质和行为上都非常不同

对于将差异分为(整个)时间单位的函数,请使用stackoverflow.com/a/53092438/3787376上的答案。

我认为此问题应删除或至少标记为“避免”,因为大多数答案都不正确或依赖于各种库。

如果JavaScript没有提供正确的内置方法,则@RobG库是唯一的选择。

@MCEmperor-投票最多的答案几乎只有3行代码,其中两行用于解析。

#1 楼

这是datediff的快速而肮脏的实现,作为解决问题中提出的问题的概念证明。它依赖于这样一个事实,您可以通过减去两个日期来获得两个日期之间经过的毫秒数,这会将它们强制为原始数字值(自1970年初以来的毫秒数)。




 // new Date("dateString") is browser-dependent and discouraged, so we'll write
// a simple parse function for U.S. date format (which does no error checking)
function parseDate(str) {
    var mdy = str.split('/');
    return new Date(mdy[2], mdy[0]-1, mdy[1]);
}

function datediff(first, second) {
    // Take the difference between the dates and divide by milliseconds per day.
    // Round to nearest whole number to deal with DST.
    return Math.round((second-first)/(1000*60*60*24));
}

alert(datediff(parseDate(first.value), parseDate(second.value))); 

 <input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/> 





您应该注意,“常规”日期API(名称中没有“ UTC”)在用户浏览器的本地时区运行,因此通常您会遇到问题如果您的用户所在的时区不是您所期望的,则您的代码将必须处理夏令时转换。您应该仔细阅读Date对象及其方法的文档,对于任何更复杂的内容,请强烈考虑使用提供更安全,功能强大的API进行日期操作的库。


数字和日期-MDN JavaScript指南
Date-MDN JavaScript参考

为了说明起见,该代码段为了简洁起见在window对象上使用了命名访问,但是在生产中,您应该使用标准化的API例如getElementById,或更可能是一些UI框架。

评论


我认为Math.trunc()更合适。以防万一有人使用更精确的Date对象(即包括小时,分钟和秒)

–王金
16年7月6日在19:46

作为标记为正确和最高投票的答案(截至目前),值得一提的是该答案不能正确处理夏时制。请参阅Michael Liu的答案。

–骨伤
16-09-21在0:01



parseDate到底能做什么?

– Mohammad Kermani
16年11月27日在9:15

@osullic-此答案使用Math.round处理夏令时,但是确实希望仅将日期传递给字符串,而不是日期和时间。

–RobG
17年2月17日1:00



请记住,在此示例中,日期采用美国格式,即MM / DD / YYYY。如果需要英国版本,则需要将parseDate方法更改为:return new Date(mdy [2],mdy [1],mdy [0] -1);

– Viqas
17年5月18日在13:28



#2 楼

在撰写本文时,只有其他答案之一可以正确处理DST(夏令时)转换。以下是位于加利福尼亚州的系统上的结果:

                                        1/1/2013- 3/10/2013- 11/3/2013-
User       Formula                      2/1/2013  3/11/2013  11/4/2013  Result
---------  ---------------------------  --------  ---------  ---------  ---------
Miles                   (d2 - d1) / N   31        0.9583333  1.0416666  Incorrect
some         Math.floor((d2 - d1) / N)  31        0          1          Incorrect
fuentesjr    Math.round((d2 - d1) / N)  31        1          1          Correct
toloco     Math.ceiling((d2 - d1) / N)  31        1          2          Incorrect

N = 86400000


尽管Math.round返回正确的结果,但我认为它有些笨拙。相反,通过显式考虑DST开始或结束时UTC偏移量的变化,我们可以使用精确的算法:

function treatAsUTC(date) {
    var result = new Date(date);
    result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
    return result;
}

function daysBetween(startDate, endDate) {
    var millisecondsPerDay = 24 * 60 * 60 * 1000;
    return (treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay;
}

alert(daysBetween($('#first').val(), $('#second').val()));


解释

JavaScript日期计算非常棘手,因为Date对象在内部以UTC而非本地时间存储时间。例如,将3/10/2013 12:00 AM AM太平洋标准时间(UTC-08:00)存储为3/10/2013 8:00 AM UTC和3/11/2013 12:00 AM太平洋夏令时间( UTC-07:00)存储为2013年3月11日上午7:00。在这一天,UTC当地时间的午夜到午夜只有23个小时!上面显示的daysBetween方法利用这一事实,首先调用treatAsUTC将两个当地时间都调整为午夜UTC,然后再进行除法和除法。

1。 JavaScript会忽略leap秒。

评论


无需使用UTC,只需将当地时间设置为午夜(或两个日期的值都相同)就可以了。夏令时引入的小数日最多仅为±0.04(在某些地方更少),因此使用Math.round进行四舍五入。 ;-)依靠Date构造函数来解析字符串不是一个好主意。如果您确实要使用UTC值,请首先使用Date.UTC(...)解析字符串。

–RobG
17-2-17在1:07



@RobG:正如我在回答中所说:“尽管Math.round返回正确的结果,但我认为它有些笨拙。相反,通过明确考虑DST开始或结束时UTC偏移量的变化,我们可以使用精确的算术。”

–迈克尔·刘(Michael Liu)
17年2月17日在1:21

实际上,从技术上讲,您表示为“不正确”的时间是正确的。您没有将DateTimes更改为UTC ...您只是在更改每个DateTime的时间以获得虚假整数。舍入不是“笨拙的”……这完全是正确的方法,因为无论如何这就是您在脑海中所做的事情:您舍入时间部分(小时,分钟,秒),只是试图获得一个整数天数。

– JDB仍然记得莫妮卡
19年8月15日在14:26



#3 楼

获得两个日期之间差异的最简单方法是:

var diff =  Math.floor(( Date.parse(str2) - Date.parse(str1) ) / 86400000); 


获得差异天数(如果无法解析一个或两个,则为NaN)。解析日期以毫秒为单位给出结果,要按天获取结果,必须将其除以24 * 60 * 60 * 1000

如果要将其除以天,小时,分钟,秒和毫秒:

function dateDiff( str1, str2 ) {
    var diff = Date.parse( str2 ) - Date.parse( str1 ); 
    return isNaN( diff ) ? NaN : {
        diff : diff,
        ms : Math.floor( diff            % 1000 ),
        s  : Math.floor( diff /     1000 %   60 ),
        m  : Math.floor( diff /    60000 %   60 ),
        h  : Math.floor( diff /  3600000 %   24 ),
        d  : Math.floor( diff / 86400000        )
    };
}


这是我的詹姆斯版本的重构版本:

function mydiff(date1,date2,interval) {
    var second=1000, minute=second*60, hour=minute*60, day=hour*24, week=day*7;
    date1 = new Date(date1);
    date2 = new Date(date2);
    var timediff = date2 - date1;
    if (isNaN(timediff)) return NaN;
    switch (interval) {
        case "years": return date2.getFullYear() - date1.getFullYear();
        case "months": return (
            ( date2.getFullYear() * 12 + date2.getMonth() )
            -
            ( date1.getFullYear() * 12 + date1.getMonth() )
        );
        case "weeks"  : return Math.floor(timediff / week);
        case "days"   : return Math.floor(timediff / day); 
        case "hours"  : return Math.floor(timediff / hour); 
        case "minutes": return Math.floor(timediff / minute);
        case "seconds": return Math.floor(timediff / second);
        default: return undefined;
    }
}


评论


错误的答案。如果时钟在夏令时前移,Math.floor()将使您迷失一天。在大多数情况下,Math.round()将给出正确的答案,但在其他答案中也有更好的选择。

– Phil B
18年8月29日在10:40

@some您在哪里看到James版本?谁是詹姆斯?

–造口术
12月1日21:32

#4 楼

我建议使用moment.js库(http://momentjs.com/docs/#/displaying/difference/)。它可以正确处理夏令时,并且通常很适合。

示例:

var start = moment("2013-11-03");
var end = moment("2013-11-04");
end.diff(start, "days")
1


评论


正如momentjs很好时的警告一样,它是一个很大的依赖项

–詹森·阿克森(Jason Axelson)
2016年12月3日,0:16

它应该确实是end.diff(start,“ days”),尽管所写的代码将起作用,因为开始日期在结束日期之后!

–gordon613
17-6-28在11:09



#5 楼

我会继续使用这个小工具,在其中您会找到适合您的函数。这是一个简短的示例:

        <script type="text/javascript" src="date.js"></script>
        <script type="text/javascript">
            var minutes = 1000*60;
            var hours = minutes*60;
            var days = hours*24;

            var foo_date1 = getDateFromFormat("02/10/2009", "M/d/y");
            var foo_date2 = getDateFromFormat("02/12/2009", "M/d/y");

            var diff_date = Math.round((foo_date2 - foo_date1)/days);
            alert("Diff date is: " + diff_date );
        </script>


#6 楼

步骤

设置开始日期
设置结束日期
计算差异
将毫秒转换为天数

本地JS
<预课=“ lang-js prettyprint-override”> const startDate = '2020-01-01'; const endDate = '2020-03-15'; const diffInMs = new Date(endDate) - new Date(startDate) const diffInDays = diffInMs / (1000 * 60 * 60 * 24);

评论
我知道这不是您的问题的一部分,但总的来说,我不建议您进行任何日期计算或由于存在许多极端情况,因此可以在普通JavaScript中进行操作,而宁愿使用date-fns,Luxon或moment.js之类的库。

使用库
Date-fns
https ://date-fns.org/v2.16.1/docs/differenceInDays
 const differenceInDays = require('date-fns/differenceInDays');

const startDate  = '2020-01-01';
const endDate    = '2020-03-15';

const diffInDays = differenceInDays(new Date(endDate), new Date(startDate));
 

Luxon
https:/ /moment.github.io/luxon/docs/class/src/datetime.js~DateTime.html#instance-method-diff
 const { DateTime } = require('luxon');

const startDate  = '2020-01-01';
const endDate    = '2020-03-15';

const diffInDays = DateTime.fromISO(endDate).diff(DateTime.fromISO(startDate), 'days').toObject().days;
 

Moment.js
https://momentjs.com/docs/#/displaying/difference/
 const moment = require('moment');

const startDate  = '2020-01-01';
const endDate    = '2020-03-15';

const diffInDays = moment(endDate).diff(moment(startDate), 'days');
 

RunKit上的示例
https://runkit.com/marcobiedermann/5f573e211 e85e7001a37ab00

评论


我很欣赏这样的答案:简短,简单且不需要随机依赖!干杯。

–daCoda
19年1月24日,9:10

只是我的消极时间回报了吗? timeDiff不应该是(new Date(endDate))-(new Date(startDate)); ?

– Feyisayo Sonubi
19年8月4日在1:17



@ feyisayo-sonubi取决于您在开始日期和结束日期中传递的顺序。在此示例中(new Date('2017-11-08'))-(new Date('2017-10-01'))// 3283200000

– marcobiedermann
19年8月4日在9:58

const timeDiff = +(新日期(开始))-+(新日期(结束));

– Ben Racicot
4月19日0:59

大。虽然我更喜欢return(Date.UTC(yr2,mo2-1,dy2)-Date.UTC(yr1,mo1-1,dy1))/ 86400000;

–dcromley
5月20日16:15

#7 楼

使用Moment.js




 var future = moment('05/02/2015');
var start = moment('04/23/2015');
var d = future.diff(start, 'days'); // 9
console.log(d); 

 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment-with-locales.min.js"></script> 




评论


moment.js对于诸如YTD diff counts之类的事情真的非常方便var now = moment(),yearStart = moment()。startOf('year'); var ytdDays = now.diff(yearStart,'days'); //这可以是年,月,周,天,小时,分钟和秒。console.log(ytdDays);更多内容:momentjs.com

–谢里夫(Sharif)
17年7月12日在21:04



#8 楼

JS中的日期值是日期时间值。

因此,直接日期计算不一致:

(2013-11-05 00:00:00) - (2013-11-04 10:10:10) < 1 day


例如我们需要转换第二个日期:

(2013-11-05 00:00:00) - (2013-11-04 00:00:00) = 1 day


该方法可以在两个日期截断工厂:




 var date1 = new Date('2013/11/04 00:00:00');
var date2 = new Date('2013/11/04 10:10:10'); //less than 1
var start = Math.floor(date1.getTime() / (3600 * 24 * 1000)); //days as integer from..
var end = Math.floor(date2.getTime() / (3600 * 24 * 1000)); //days as integer from..
var daysDiff = end - start; // exact dates
console.log(daysDiff);

date2 = new Date('2013/11/05 00:00:00'); //1

var start = Math.floor(date1.getTime() / (3600 * 24 * 1000)); //days as integer from..
var end = Math.floor(date2.getTime() / (3600 * 24 * 1000)); //days as integer from..
var daysDiff = end - start; // exact dates
console.log(daysDiff); 




#9 楼

最好通过使用UTC时间来消除DST,Math.ceil,Math.floor等:

var firstDate = Date.UTC(2015,01,2);
var secondDate = Date.UTC(2015,04,22);
var diff = Math.abs((firstDate.valueOf() 
    - secondDate.valueOf())/(24*60*60*1000));


本示例给出了109天的差异。 24*60*60*1000是以毫秒为单位的一天。

#10 楼

要计算两个给定日期之间的天数,可以使用以下代码。我在这里使用的日期是2016年1月1日至2016年12月31日。




 var day_start = new Date("Jan 01 2016");
var day_end = new Date("Dec 31 2016");
var total_days = (day_end - day_start) / (1000 * 60 * 60 * 24);
document.getElementById("demo").innerHTML = Math.round(total_days); 

 <h3>DAYS BETWEEN GIVEN DATES</h3>
<p id="demo"></p> 




#11 楼

可以使用以下公式计算跨不同TZ的两个日期之间的完整证明天数差异:




 var start = new Date('10/3/2015');
var end = new Date('11/2/2015');
var days = (end - start) / 1000 / 60 / 60 / 24;
console.log(days);
// actually its 30 ; but due to daylight savings will show 31.0xxx
// which you need to offset as below
days = days - (end.getTimezoneOffset() - start.getTimezoneOffset()) / (60 * 24);
console.log(days); 




评论


这是最正确的答案,您必须考虑DST!谢谢

– Gisway
19-10-7在20:50

#12 楼

我想在两个日期上进行一些计算时发现了这个问题,但该日期具有小时和分钟值,因此我修改了@ michael-liu的答案以符合我的要求,并通过了我的测试。

差异日2012-12-31 23:002013-01-01 01:00应该等​​于1。(2小时)
差异日2012-12-31 01:002013-01-01 23:00应该等​​于1。(46小时)

function treatAsUTC(date) {
    var result = new Date(date);
    result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
    return result;
}

var millisecondsPerDay = 24 * 60 * 60 * 1000;
function diffDays(startDate, endDate) {
    return Math.floor(treatAsUTC(endDate) / millisecondsPerDay) - Math.floor(treatAsUTC(startDate) / millisecondsPerDay);
}


#13 楼

var start= $("#firstDate").datepicker("getDate");
var end= $("#SecondDate").datepicker("getDate");
var days = (end- start) / (1000 * 60 * 60 * 24);
 alert(Math.round(days));


jsfiddle示例:)

#14 楼

我认为解决方案不正确100%我将使用ceil而不是地板,圆形可以工作,但操作不正确。

function dateDiff(str1, str2){
    var diff = Date.parse(str2) - Date.parse(str1); 
    return isNaN(diff) ? NaN : {
        diff: diff,
        ms: Math.ceil(diff % 1000),
        s: Math.ceil(diff / 1000 % 60),
        m: Math.ceil(diff / 60000 % 60),
        h: Math.ceil(diff / 3600000 % 24),
        d: Math.ceil(diff / 86400000)
    };
}


评论


一天的时间可能超过24小时,分钟的时间可能超过60秒。在这些情况下,使用Math.ceil()会过高。

–丰富的面团
2012年4月7日在22:28

#15 楼

如何使用DatePicker小部件中的formatDate?您可以使用它来转换时间戳格式的日期(自1970年1月1日以来的毫秒数),然后进行简单的减法。

#16 楼

这可能不是最优雅的解决方案,但是我认为它似乎可以用相对简单的代码来回答这个问题。您不能使用这样的方法:

function dayDiff(startdate, enddate) {
  var dayCount = 0;

  while(enddate >= startdate) {
    dayCount++;
    startdate.setDate(startdate.getDate() + 1);
  }

return dayCount; 
}


这是假设您要传递日期对象作为参数。

评论


最简单的解决方案始终是最好的解决方案。希望我能投票+100

–签名
8月8日18:48

#17 楼




 function timeDifference(date1, date2) {
  var oneDay = 24 * 60 * 60; // hours*minutes*seconds
  var oneHour = 60 * 60; // minutes*seconds
  var oneMinute = 60; // 60 seconds
  var firstDate = date1.getTime(); // convert to milliseconds
  var secondDate = date2.getTime(); // convert to milliseconds
  var seconds = Math.round(Math.abs(firstDate - secondDate) / 1000); //calculate the diffrence in seconds
  // the difference object
  var difference = {
    "days": 0,
    "hours": 0,
    "minutes": 0,
    "seconds": 0,
  }
  //calculate all the days and substract it from the total
  while (seconds >= oneDay) {
    difference.days++;
    seconds -= oneDay;
  }
  //calculate all the remaining hours then substract it from the total
  while (seconds >= oneHour) {
    difference.hours++;
    seconds -= oneHour;
  }
  //calculate all the remaining minutes then substract it from the total 
  while (seconds >= oneMinute) {
    difference.minutes++;
    seconds -= oneMinute;
  }
  //the remaining seconds :
  difference.seconds = seconds;
  //return the difference object
  return difference;
}
console.log(timeDifference(new Date(2017,0,1,0,0,0),new Date())); 




评论


请允许我在您的答案周围添加更多背景信息。仅代码的答案很难理解。如果您可以在帖子中添加更多信息,它将对询问者和将来的读者都有帮助。

– RBT
17年1月22日,0:13

我想编辑,但是出现错误,我可以提交编辑:(。

– Noreddine Belhadj Cheikh
17年1月22日在16:15

@ N.Belhadj,您可以用简单的div和mod(%)操作替换所有while循环

– Mihail Shishkov
17年5月24日在16:46

#18 楼

简单,容易和复杂。每1秒调用一次此函数以更新时间。
const year = (new Date().getFullYear());
const bdayDate = new Date("04,11,2019").getTime(); //mmddyyyy

// countdown
let timer = setInterval(function () {

    // get today's date
    const today = new Date().getTime();

    // get the difference
    const diff = bdayDate - today;

    // math
    let days = Math.floor(diff / (1000 * 60 * 60 * 24));
    let hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
    let minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
    let seconds = Math.floor((diff % (1000 * 60)) / 1000);

}, 1000);


#19 楼

如果您有两个unix时间戳,则可以使用此函数(为清晰起见,使其更加详细):

// Calculate number of days between two unix timestamps
// ------------------------------------------------------------
var daysBetween = function(timeStampA, timeStampB) {
    var oneDay = 24 * 60 * 60 * 1000; // hours * minutes * seconds * milliseconds
    var firstDate = new Date(timeStampA * 1000);
    var secondDate = new Date(timeStampB * 1000);
    var diffDays = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
    return diffDays;
};


示例:

daysBetween(1096580303, 1308713220); // 2455


#20 楼

使用毫秒时要小心。

date.getTime()返回毫秒,并且以毫秒为单位进行数学运算需要包含


夏令时(DST)
检查两个日期是否具有相同的时间(小时,分钟,秒,毫秒)
确保所需的日期差异是什么:2016年9月19日-2016年9月29日= 1天或2天差? />
上面评论中的示例是我到目前为止找到的最佳解决方案
https://stackoverflow.com/a/11252167/2091095。但是,如果要计算所有涉及的天数,请使用+1作为结果。

function treatAsUTC(date) {
    var result = new Date(date);
    result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
    return result;
}

function daysBetween(startDate, endDate) {
    var millisecondsPerDay = 24 * 60 * 60 * 1000;
    return (treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay;
}

var diff = daysBetween($('#first').val(), $('#second').val()) + 1;


#21 楼




 Date.prototype.days = function(to) {
  return Math.abs(Math.floor(to.getTime() / (3600 * 24 * 1000)) - Math.floor(this.getTime() / (3600 * 24 * 1000)))
}


console.log(new Date('2014/05/20').days(new Date('2014/05/23'))); // 3 days

console.log(new Date('2014/05/23').days(new Date('2014/05/20'))); // 3 days 




#22 楼

我在Angular中遇到了同样的问题。我进行复制,因为否则他将覆盖第一个日期。两个日期都必须有时间00:00:00(显然)

 /*
* Deze functie gebruiken we om het aantal dagen te bereken van een booking.
* */
$scope.berekenDagen = function ()
{
    $scope.booking.aantalDagen=0;

    /*De loper is gelijk aan de startdag van je reservatie.
     * De copy is nodig anders overschijft angular de booking.van.
     * */
    var loper = angular.copy($scope.booking.van);

    /*Zolang de reservatie beschikbaar is, doorloop de weekdagen van je start tot einddatum.*/
    while (loper < $scope.booking.tot) {
        /*Tel een dag op bij je loper.*/
        loper.setDate(loper.getDate() + 1);
        $scope.booking.aantalDagen++;
    }

    /*Start datum telt natuurlijk ook mee*/
    $scope.booking.aantalDagen++;
    $scope.infomsg +=" aantal dagen: "+$scope.booking.aantalDagen;
};


#23 楼

我使用下面的代码来试验新闻发布的发布日期功能。我根据发布日期和当前日期来计算分钟,小时,天或年。

var startDate= new Date("Mon Jan 01 2007 11:00:00");
var endDate  =new Date("Tue Jan 02 2007 12:50:00");
var timeStart = startDate.getTime();
var timeEnd = endDate.getTime();
var yearStart = startDate.getFullYear();
var yearEnd   = endDate.getFullYear();
if(yearStart == yearEnd)
 {
  var hourDiff = timeEnd - timeStart; 
  var secDiff = hourDiff / 1000;
  var minDiff = hourDiff / 60 / 1000; 
  var hDiff = hourDiff / 3600 / 1000; 
  var myObj = {};
  myObj.hours = Math.floor(hDiff);
  myObj.minutes = minDiff  
  if(myObj.hours >= 24)
   {
    console.log(Math.floor(myObj.hours/24) + "day(s) ago")
   } 
 else if(myObj.hours>0)
  {
   console.log(myObj.hours +"hour(s) ago")
  }
 else
  {
   console.log(Math.abs(myObj.minutes) +"minute(s) ago")
  }
}
else
{
var yearDiff = yearEnd - yearStart;
console.log( yearDiff +" year(s) ago");
}


评论


请解释您的代码,您就可以解决问题,仅粘贴代码被认为是错误的答案。

– Marco Scabbiolo
16年7月21日在13:51

尽管此代码可以回答问题,但提供有关如何和/或为什么解决问题的其他上下文将提高​​答案的长期价值。

–迈克尔·帕克(Michael Parker)
16年7月21日在16:47

感谢@ MarcoScabbiolo,@ Michael Parker的评论。由于我是Stackoverflow的新手,所以我不知道该如何提供解决方案

–拉米斯·拉哈特(Ramees Rahath)
16年7月22日在16:07

#24 楼

如果您想使用带有日期的DateArray,请尝试以下操作:

<script>
        function getDates(startDate, stopDate) {
        var dateArray = new Array();
        var currentDate = moment(startDate);
        dateArray.push( moment(currentDate).format('L'));

        var stopDate = moment(stopDate);
        while (dateArray[dateArray.length -1] != stopDate._i) {
            dateArray.push( moment(currentDate).format('L'));
            currentDate = moment(currentDate).add(1, 'days');
        }
        return dateArray;
      }
</script>


DebugSnippet

#25 楼

计算两个日期之间的天数的简单方法是删除它们的两个时间分量,即将小时,分钟,秒和毫秒设置为0,然后减去它们的时间并将其潜水一天的毫秒数。

var firstDate= new Date(firstDate.setHours(0,0,0,0));
var secondDate= new Date(secondDate.setHours(0,0,0,0));
var timeDiff = firstDate.getTime() - secondDate.getTime();
var diffDays =timeDiff / (1000 * 3600 * 24);


评论


解决方案的问题是,您假设firstDate和secondDate为日期,那么就无需再次将它们更改为日期,如果它们不是日期*不是,则setHours会出错。若要更正此问题,您需要将setHours移出新的Date

– AaA
2月24日,3:27

#26 楼

function formatDate(seconds, dictionary) {
    var foo = new Date;
    var unixtime_ms = foo.getTime();
    var unixtime = parseInt(unixtime_ms / 1000);
    var diff = unixtime - seconds;
    var display_date;
    if (diff <= 0) {
        display_date = dictionary.now;
    } else if (diff < 60) {
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.second;
        } else {
            display_date = diff + ' ' + dictionary.seconds;
        }
    } else if (diff < 3540) {
        diff = Math.round(diff / 60);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.minute;
        } else {
            display_date = diff + ' ' + dictionary.minutes;
        }
    } else if (diff < 82800) {
        diff = Math.round(diff / 3600);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.hour;
        } else {
            display_date = diff + ' ' + dictionary.hours;
        }
    } else {
        diff = Math.round(diff / 86400);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.day;
        } else {
            display_date = diff + ' ' + dictionary.days;
        }
    }
    return display_date;
}


#27 楼

我从其他答案中得到了一些启发,并使输入内容具有自动卫生功能。我希望这能很好地改善其他答案。



 //use best practices by labeling your constants.
let MS_PER_SEC = 1000
  , SEC_PER_HR = 60 * 60
  , HR_PER_DAY = 24
  , MS_PER_DAY = MS_PER_SEC * SEC_PER_HR * HR_PER_DAY
;

//let's assume we get Date objects as arguments, otherwise return 0.
function dateDiffInDays(date1, date2) {
    if (!date1 || !date2) {
      return 0;
    }
    return Math.round((date2.getTime() - date1.getTime()) / MS_PER_DAY);
}

// new Date("dateString") is browser-dependent and discouraged, so we'll write
// a simple parse function for U.S. date format. (by @Miles)
function parseDate(str) {
    if (str && str.length > 7 && str.length < 11) {
      let mdy = str.split('/');
      return new Date(mdy[2], mdy[0]-1, mdy[1]);
    }
    return null;
}

function calcInputs() {
  let date1 = document.getElementById("date1")
    , date2 = document.getElementById("date2")
    , resultSpan = document.getElementById("result")
  ;
  if (date1 && date2 && resultSpan) {
    //remove non-date characters
    let date1Val = date1.value.replace(/[^\d\/]/g,'')
      , date2Val = date2.value.replace(/[^\d\/]/g,'')
      , result = dateDiffInDays(parseDate(date1Val), parseDate(date2Val))
    ;
    date1.value = date1Val;
    date2.value = date2Val;
    resultSpan.innerHTML = result + " days";
  }
}
window.onload = function() { calcInputs(); };

//some code examples
console.log(dateDiffInDays(parseDate("1/15/2019"), parseDate("1/30/2019")));
console.log(dateDiffInDays(parseDate("1/15/2019"), parseDate("2/30/2019")));
console.log(dateDiffInDays(parseDate("1/15/2000"), parseDate("1/15/2019"))); 

 <input id="date1" type="text" value="1/1/2000" size="6" onkeyup="calcInputs();" />
<input id="date2" type="text" value="1/1/2019" size="6" onkeyup="calcInputs();"/>
Result: <span id="result"></span> 




#28 楼




忽略时间部分的更好解决方案


如果两个日期相同,它将返回0。




 function dayDiff(firstDate, secondDate) {
  firstDate = new Date(firstDate);
  secondDate = new Date(secondDate);
  if (!isNaN(firstDate) && !isNaN(secondDate)) {
    firstDate.setHours(0, 0, 0, 0); //ignore time part
    secondDate.setHours(0, 0, 0, 0); //ignore time part
    var dayDiff = secondDate - firstDate;
    dayDiff = dayDiff / 86400000; // divide by milisec in one day
    console.log(dayDiff);
  } else {
    console.log("Enter valid date.");
  }
}

$(document).ready(function() {
  $('input[type=datetime]').datepicker({
    dateFormat: "mm/dd/yy",
    changeMonth: true,
    changeYear: true
  });
  $("#button").click(function() {
    dayDiff($('#first').val(), $('#second').val());
  });
}); 

 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="//code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

<input type="datetime" id="first" value="12/28/2016" />
<input type="datetime" id="second" value="12/28/2017" />
<input type="button" id="button" value="Calculate"> 




#29 楼

1970年1月1日之前和2038年1月19日之后的贡献

function DateDiff(aDate1, aDate2) {
  let dDay = 0;
  this.isBissexto = (aYear) => {
    return (aYear % 4 == 0 && aYear % 100 != 0) || (aYear % 400 == 0);
  };
  this.getDayOfYear = (aDate) => {
    let count = 0;
    for (let m = 0; m < aDate.getUTCMonth(); m++) {
      count += m == 1 ? this.isBissexto(aDate.getUTCFullYear()) ? 29 : 28 : /(3|5|8|10)/.test(m) ? 30 : 31;
    }
    count += aDate.getUTCDate();
    return count;
  };
  this.toDays = () => {
    return dDay;
  };
  (() => {
    let startDate = aDate1.getTime() <= aDate2.getTime() ? new Date(aDate1.toISOString()) : new Date(aDate2.toISOString());
    let endDate = aDate1.getTime() <= aDate2.getTime() ? new Date(aDate2.toISOString()) : new Date(aDate1.toISOString());
    while (startDate.getUTCFullYear() != endDate.getUTCFullYear()) {
      dDay += (this.isBissexto(startDate.getFullYear())? 366 : 365) - this.getDayOfYear(startDate) + 1;
      startDate = new Date(startDate.getUTCFullYear()+1, 0, 1);
    }
    dDay += this.getDayOfYear(endDate) - this.getDayOfYear(startDate);
  })();
}


#30 楼

最近,我遇到了同样的问题,来自Java世界,我立即开始搜索JavaScript的JSR 310实现。 JSR 310是Java的日期和时间API(Java 8附带的标准)。我认为API的设计非常好。
幸运的是,有一个直接指向Javascript的端口,称为js-joda。
首先,在<head>中包含js-joda:
 <script
    src="https://cdnjs.cloudflare.com/ajax/libs/js-joda/1.11.0/js-joda.min.js"
    integrity="sha512-piLlO+P2f15QHjUv0DEXBd4HvkL03Orhi30Ur5n1E4Gk2LE4BxiBAP/AD+dxhxpW66DiMY2wZqQWHAuS53RFDg=="
    crossorigin="anonymous"></script>
 

然后只需执行以下操作:
 let date1 = JSJoda.LocalDate.of(2020, 12, 1);
let date2 = JSJoda.LocalDate.of(2021, 1, 1);
let daysBetween = JSJoda.ChronoUnit.DAYS.between(date1, date2);
 

现在daysBetween包含之间的天数。请注意,结束日期是唯一的。