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

<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中获得两个日期之间的天数?


当前回答

Bookmarklet版本的其他答案,提示你两个日期:

javascript:(function() {
    var d = new Date(prompt("First Date or leave blank for today?") || Date.now());
    prompt("Days Between", Math.round(
        Math.abs(
            (d.getTime() - new Date(prompt("Date 2")).getTime())
                /(24*60*60*1000)
             )
        ));
})();

其他回答

Bookmarklet版本的其他答案,提示你两个日期:

javascript:(function() {
    var d = new Date(prompt("First Date or leave blank for today?") || Date.now());
    prompt("Days Between", Math.round(
        Math.abs(
            (d.getTime() - new Date(prompt("Date 2")).getTime())
                /(24*60*60*1000)
             )
        ));
})();

1970-01-01之前和2038-01-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);
  })();
}

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

我还推荐使用<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>

如果我们想计算我们的年龄,这是一个有点不同的答案

    {
      birthday: 'April 22, 1993',
      names: {
        first: 'Keith',
        last: 'Buckley'
      }
    },
    {
      birthday: 'January 3, 1975',
      names: {
        first: 'Larry',
        last: 'Heep'
      }
    },
    {
      birthday: 'February 12, 1944',
      names: {
        first: 'Linda',
        last: 'Bermeer'
      }
    }
  ];
const cleanPeople = people.map(function ({birthday, names:{first, last}}) {
      // birthday, age, fullName;
      const now = new Date();
      var age =  Math.floor(( Date.parse(now) - Date.parse(birthday)) / 31536000000);
      return {
        age,
        fullName:`${first} ${last}`
      }
    });
    console.log(cleanPeople);
    console.table(cleanPeople);

您可以使用UnderscoreJS来格式化和计算差异。

演示https://jsfiddle.net/sumitridhal/8sv94msp/

var startDate = moment(“206 -08- 29t23:35:01”); var endDate = moment(“206 -08- 30t23:35:01”); 游戏机。log (startDate); 游戏机。log (endDate); var结果= endDate。diff(startDate, hours, true); 文件。 文档全身appendChild(文档。createTextNode (resultHours)); 身体(白色空间:pre;font-family: monospace;) “https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.5.1/moment.min.js”< script src = > / < script >