例如,在输入框中给定两个日期:

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

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

如何在JavaScript中获得两个日期之间的天数?


当前回答

我从其他答案中得到一些灵感,使输入具有自动卫生。我希望这是对其他答案的改进。

我还推荐使用<input type="date">字段,这将有助于验证用户输入。

//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(date1Time, date2Time) { if (!date1Time || !date2Time) return 0; return Math.round((date2Time - date1Time) / MS_PER_DAY); } function getUTCTime(dateStr) { const date = new Date(dateStr); // If use 'Date.getTime()' it doesn't compute the right amount of days // if there is a 'day saving time' change between dates return Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()); } function calcInputs() { let date1 = document.getElementById("date1") , date2 = document.getElementById("date2") , resultSpan = document.getElementById("result") ; if (date1.value && date2.value && resultSpan) { //remove non-date characters console.log(getUTCTime(date1.value)); let date1Time = getUTCTime(date1.value) , date2Time = getUTCTime(date2.value) , result = dateDiffInDays(date1Time, date2Time) ; resultSpan.innerHTML = result + " days"; } } window.onload = function() { calcInputs(); }; //some code examples console.log(dateDiffInDays(new Date("1/15/2019"), new Date("1/30/2019"))); console.log(dateDiffInDays(new Date("1/15/2019"), new Date("2/30/2019"))); console.log(dateDiffInDays(new Date("1/15/2000"), new Date("1/15/2019"))); <input type="date" id="date1" value="2000-01-01" onchange="calcInputs();" /> <input type="date" id="date2" value="2022-01-01" onchange="calcInputs();"/> Result: <span id="result"></span>

其他回答

区分两个日期的最简单方法是:

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

以下是我对James版本的重构版本:

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

如果你想有一个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>

调试片段

我来找这个小工具在里面你会找到这个的函数。这里有一个简短的例子:

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

下面的解决方案将假设这些变量在代码中可用:

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

原生 JS

步骤:

设定开始日期 设定结束日期 计算的区别 将毫秒转换为天

const diffInMs   = new Date(endDate) - new Date(startDate)
const diffInDays = diffInMs / (1000 * 60 * 60 * 24);

备注:

我知道这不是你问题的一部分,但一般来说,我不建议在香草JavaScript中做任何日期计算或操作,而是使用date-fns, Luxon或moment.js这样的库,因为有许多边缘情况。

这个简单的JavaScript回答以十进制数计算天数。此外,在使用夏令时时,它可能会遇到边缘情况


使用图书馆

- 日期-fns

const differenceInDays = require('date-fns/differenceInDays');
const diffInDays = differenceInDays(new Date(endDate), new Date(startDate));

文档:https://date-fns.org/v2.16.1/docs/differenceInDays

——国际光子

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

文档:https://moment.github.io/luxon/docs/class/src/datetime.js DateTime.html # instance-method-diff

——Moment.js

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

文档:https://momentjs.com/docs/ / /显示/不同


RunKit示例

我从其他答案中得到一些灵感,使输入具有自动卫生。我希望这是对其他答案的改进。

我还推荐使用<input type="date">字段,这将有助于验证用户输入。

//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(date1Time, date2Time) { if (!date1Time || !date2Time) return 0; return Math.round((date2Time - date1Time) / MS_PER_DAY); } function getUTCTime(dateStr) { const date = new Date(dateStr); // If use 'Date.getTime()' it doesn't compute the right amount of days // if there is a 'day saving time' change between dates return Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()); } function calcInputs() { let date1 = document.getElementById("date1") , date2 = document.getElementById("date2") , resultSpan = document.getElementById("result") ; if (date1.value && date2.value && resultSpan) { //remove non-date characters console.log(getUTCTime(date1.value)); let date1Time = getUTCTime(date1.value) , date2Time = getUTCTime(date2.value) , result = dateDiffInDays(date1Time, date2Time) ; resultSpan.innerHTML = result + " days"; } } window.onload = function() { calcInputs(); }; //some code examples console.log(dateDiffInDays(new Date("1/15/2019"), new Date("1/30/2019"))); console.log(dateDiffInDays(new Date("1/15/2019"), new Date("2/30/2019"))); console.log(dateDiffInDays(new Date("1/15/2000"), new Date("1/15/2019"))); <input type="date" id="date1" value="2000-01-01" onchange="calcInputs();" /> <input type="date" id="date2" value="2022-01-01" onchange="calcInputs();"/> Result: <span id="result"></span>