<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>
<script>
alert(datediff("day", first, second)); // what goes here?
</script>
#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:00
和2013-01-01 01:00
应该等于1。(2小时)差异日
2012-12-31 01:00
和2013-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
包含之间的天数。请注意,结束日期是唯一的。
评论
用户询问“两个日期之间的天数”的案例中,有99%的她不理解的是,她试图将苹果与梨进行比较。如果问“日期范围中有多少个日期?”,或者我必须在日历上跨越多少个正方形,问题就变得如此简单。这样就省去了时间和夏时制等问题。由于日期时间数据结构纯粹是胡说八道,这给我们带来了混乱。没有日期时间,没有日期,没有时间,这两个对象在本质和行为上都非常不同对于将差异分为(整个)时间单位的函数,请使用stackoverflow.com/a/53092438/3787376上的答案。
我认为此问题应删除或至少标记为“避免”,因为大多数答案都不正确或依赖于各种库。
如果JavaScript没有提供正确的内置方法,则@RobG库是唯一的选择。
@MCEmperor-投票最多的答案几乎只有3行代码,其中两行用于解析。