我如何获得整整2个日期之间的差额(我不想一天中的任何时间)
var date1 = new Date('7/11/2010');
var date2 = new Date('12/12/2010');
var diffDays = date2.getDate() - date1.getDate();
alert(diffDays)
我尝试了以上但这不起作用。
#1 楼
这是一种方法: const date1 = new Date('7/13/2010');
const date2 = new Date('12/15/2010');
const diffTime = Math.abs(date2 - date1);
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
console.log(diffTime + " milliseconds");
console.log(diffDays + " days");
请注意,我们需要将日期用引号引起来。其余代码获取时差(以毫秒为单位),然后除以天数。日期应采用mm / dd / yyyy格式。
评论
正如volkan在下面回答的那样,1000 * 3600 * 24是每天的毫秒数。至于总是返回正数,这是一个功能:)通常,当人们谈论两个日期之间的天数时,该数是正数。如果方向很重要,只需删除Math.abs()。
– TNi
2010年7月11日在22:38
同样,您的方法将获得1天,因为getDate()返回不考虑月份的日期。因此,您将得到12-11 = 1。
– TNi
2010年7月11日在22:40
日期已经返回的时间不需要调用.getTime()
–volkaner
2010年7月11日在22:56
为了使其在夏时制下正常工作,Math.round应该替换Math.ceil。但是我认为Shyam的答案是正确的方法。
– Zemljoradnik
13年6月24日在10:31
在计算出的跨度中,每天23小时25小时不起作用。在设计此类计算之前,请先咨询UTC(通用协调时间)和“民用”时间标准的详细处理方法。一天并非总是86,400秒,即使使用UTC也是如此。但是,ECMA标准规定,在UTC中,它不会有58、59、61或62秒的分钟出现在每年两次。您不能假定其他语言和操作系统与纪元(1970年1月1日00:00:00)之间的偏移量将是相同的,因为其中一些具有58、59、61和62秒的分钟。
– Jim
2015年3月8日,3:13
#2 楼
一个更正确的解决方案...因为日期自然具有时区信息,所以可以跨越具有不同日光节约调整的区域
该问题的先前答案没有考虑到两个日期跨越夏令时(DST)的情况。 DST更改发生的日期将具有
!= 1000*60*60*24
的持续时间(以毫秒为单位),因此典型计算将失败。您可以通过以下方法解决此问题:首先将两个日期标准化为UTC,然后进行计算这两个UTC日期之间的时差。
现在,解决方案可以写为,
const _MS_PER_DAY = 1000 * 60 * 60 * 24;
// a and b are javascript Date objects
function dateDiffInDays(a, b) {
// Discard the time and time-zone information.
const utc1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());
const utc2 = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate());
return Math.floor((utc2 - utc1) / _MS_PER_DAY);
}
// test it
const a = new Date("2017-01-01"),
b = new Date("2017-07-25"),
difference = dateDiffInDays(a, b);
这是有效的,因为UTC时间从不遵守DST 。请参阅UTC遵守夏令时吗?
页。在讨论了有关此答案的一些评论之后,一旦您了解了跨越DST边界的javascript日期的问题,很可能不只一种解决方法。我上面提供的是一个简单(经过测试)的解决方案。我很想知道是否有一个简单的基于算术/数学的解决方案,而不必实例化两个新的Date对象。这可能会更快。
评论
这是唯一正确的答案,我不明白为什么其他答案如果被接受
–obenjiro
13年4月5日在8:26
可能是因为@ chobo2还没有回来查看此问题
– Shyam Habarakada
13年4月6日在20:47
@Ai_boy:虽然这是逻辑上最正确的答案,但是没有任何值无法匹配更简单的Math.round((b-a)/ _MS_PER_DAY,0),因此很难支持“唯一正确的答案” ”。
–斯科特·索耶(Scott Sauyet)
13年8月21日在0:56
这个答案是错误的。 Javascript日期对象是UTC。使用本地值生成UTC日期将忽略夏令时,因此,如果认为差异是本地的,则将日期视为UTC将删除夏令时(因此答案可能在夏令时边界上是错误的)。
–RobG
14-9-29 at 1:39
使用UTC代替本地时区将纠正由民用时间系统中23小时和25小时工作日引起的问题。 UTC还具有每年最多两次的58、59、61和62秒分钟,因此,在UTC中一天不会总是有86,400秒。但是,ECMA标准规定JavaScript不会合并这些调整,因此在纯JavaScript中工作时可以忽略它们。但是,其他系统不会忽略它们,并且您不能假定与纪元时刻(1970年1月1日00:00:00)之间的偏移在编程语言和操作系统之间始终是相同的。
– Jim
2015年3月8日在3:03
#3 楼
这是使用moment.js的解决方案:var a = moment('7/11/2010','M/D/YYYY');
var b = moment('12/12/2010','M/D/YYYY');
var diffDays = b.diff(a, 'days');
alert(diffDays);
我使用了原始输入值,但是您没有指定格式,因此我假设第一个值是7月11日。如果计划在11月7日,则将格式调整为
D/M/YYYY
。评论
干杯,我一直在寻找moment.js解决方案
– jhhoff02
16-09-6在12:54
@马特·约翰逊(Matt Johnson):我有要求找到确切的差额,我的意思是,从这个时间到未来的日期还剩下天数,小时,分钟和秒数?怎么做?
–艾达(Imdad Ali)
18年5月31日在17:59
@ImdadAli-请参阅stackoverflow.com/a/41876250/634824。
–马特·约翰逊·品特(Matt Johnson-Pint)
18年5月31日在20:37
请注意,moment.js是一个很大的依赖项
– codemirror
19年3月1日在10:33
#4 楼
var date1 = new Date("7/11/2010");
var date2 = new Date("8/11/2010");
var diffDays = parseInt((date2 - date1) / (1000 * 60 * 60 * 24), 10);
alert(diffDays )
评论
date2-date1 =>毫秒输出(1000 * 60 * 60 * 24)=>毫秒到天
–volkaner
2010年7月11日在22:36
parseInt是否完全没有必要?
–基督徒
2010年7月11日在23:02
获得天数的全部价值;要求,并将受到与工作有关的...
–volkaner
2010年7月11日23:06
克里斯蒂安:他想要一个整数。 parseInt可能是最糟糕的方法。 Math.round是“正常”方式;它四舍五入而不是被截断。如果需要截断,则用'0'表示表达式就足够了:(date2-date1)/(1000 * 60 * 60 * 24)| 0
– Dagg Nabbit
2010年7月12日,0:05
请注意,此解决方案并不完全准确,因为在某些情况下,即2015-04-06减去2015-04-04给出了错误的1天,都是关于parseInt()方法的。
–ontananza
15年3月24日在22:54
#5 楼
我尝试了很多方法,发现使用datepicker是最好的方法,但是日期格式会导致JavaScript问题...。所以这是我的答案,可以立即使用。
<input type="text" id="startdate">
<input type="text" id="enddate">
<input type="text" id="days">
<script src="https://code.jquery.com/jquery-1.8.3.js"></script>
<script src="https://code.jquery.com/ui/1.10.0/jquery-ui.js"></script>
<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/redmond/jquery-ui.css" />
<script>
$(document).ready(function() {
$( "#startdate,#enddate" ).datepicker({
changeMonth: true,
changeYear: true,
firstDay: 1,
dateFormat: 'dd/mm/yy',
})
$( "#startdate" ).datepicker({ dateFormat: 'dd-mm-yy' });
$( "#enddate" ).datepicker({ dateFormat: 'dd-mm-yy' });
$('#enddate').change(function() {
var start = $('#startdate').datepicker('getDate');
var end = $('#enddate').datepicker('getDate');
if (start<end) {
var days = (end - start)/1000/60/60/24;
$('#days').val(days);
}
else {
alert ("You cant come back before you have been!");
$('#startdate').val("");
$('#enddate').val("");
$('#days').val("");
}
}); //end change function
}); //end ready
</script>
在这里可以看到小提琴DEMO
评论
这与我对这个解决方案有一个类似的问题是,如果用户首先单击date2 datepicker,则它将失败。
–亚历山大
18年5月12日在6:30
#6 楼
这是从一个日期减去另一个日期的代码。此示例将日期转换为对象,因为除非它是Date对象,否则getTime()函数将不起作用。 var dat1 = document.getElementById('inputDate').value;
var date1 = new Date(dat1)//converts string to date object
alert(date1);
var dat2 = document.getElementById('inputFinishDate').value;
var date2 = new Date(dat2)
alert(date2);
var oneDay = 24 * 60 * 60 * 1000; // hours*minutes*seconds*milliseconds
var diffDays = Math.abs((date1.getTime() - date2.getTime()) / (oneDay));
alert(diffDays);
评论
附带说明:不要使用这些字符串作为输入来创建Date对象;这是非标准的,取决于浏览器如何解析它们。使用可以由Date.parse解析的字符串,或者使用三个数值作为新Date的参数,例如new Date(2010,11,7);.旁注:永远不要相信客户端的系统时间!经常出错,您可能会中断应用程序。
另外,请尝试访问stackoverflow.com/a/53092438/3787376上的一个小功能。
@Edward,您真的称其为SMALL函数吗? :)