例如,在输入框中给定两个日期:
<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 id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>
<script>
alert(datediff("day", first, second)); // what goes here?
</script>
如何在JavaScript中获得两个日期之间的天数?
当前回答
下面是datediff的快速实现,作为解决问题的概念证明。它依赖于这样一个事实,即您可以通过减去两个日期之间经过的毫秒,这将它们强制转换为原始数字值(自1970年初以来的毫秒)。
/** * Take the difference between the dates and divide by milliseconds per day. * Round to nearest whole number to deal with DST. */ function datediff(first, second) { return Math.round((second - first) / (1000 * 60 * 60 * 24)); } /** * 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]); } alert(datediff(parseDate(first.value), parseDate(second.value))); <input id="first" value="1/1/2000"/> <input id="second" value="1/1/2001"/>
You should be aware that the "normal" Date APIs (without "UTC" in the name) operate in the local timezone of the user's browser, so in general you could run into issues if your user is in a timezone that you don't expect, and your code will have to deal with Daylight Saving Time transitions. You should carefully read the documentation for the Date object and its methods, and for anything more complicated, strongly consider using a library that offers more safe and powerful APIs for date manipulation.
数字和日期——MDN JavaScript指南 日期——MDN JavaScript参考
同样,出于说明的目的,为了简洁起见,该代码段对窗口对象使用了命名访问,但在生产中应该使用getElementById之类的标准化api,或者更有可能使用一些UI框架。
其他回答
下面的解决方案将假设这些变量在代码中可用:
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示例
计算两个日期之间天数的简单方法是去掉它们的时间分量,即将小时、分钟、秒和毫秒设置为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);
这可能不是最优雅的解决方案,但我认为它似乎用一段相对简单的代码就回答了这个问题。你不能用这样的词吗?
function dayDiff(startdate, enddate) {
var dayCount = 0;
while(enddate >= startdate) {
dayCount++;
startdate.setDate(startdate.getDate() + 1);
}
return dayCount;
}
这是假设您将日期对象作为参数传递。
我建议使用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
我从其他答案中得到一些灵感,使输入具有自动卫生。我希望这是对其他答案的改进。
我还推荐使用<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>