我如何获得整整2个日期之间的差额(我不想一天中的任何时间)

var date1 = new Date('7/11/2010');
var date2 = new Date('12/12/2010');
var diffDays = date2.getDate() - date1.getDate(); 
alert(diffDays)


我尝试了以上但这不起作用。

评论

附带说明:不要使用这些字符串作为输入来创建Date对象;这是非标准的,取决于浏览器如何解析它们。使用可以由Date.parse解析的字符串,或者使用三个数值作为新Date的参数,例如new Date(2010,11,7);.

旁注:永远不要相信客户端的系统时间!经常出错,您可能会中断应用程序。

另外,请尝试访问stackoverflow.com/a/53092438/3787376上的一个小功能。

@Edward,您真的称其为SMALL函数吗? :)

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