在JavaScript中2个日期之间的差异?

cho*_*bo2 496 javascript date

如何获得完整日期中2个日期之间的差异(我不想要一天中的任何一小部分)

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

我试过上面的但是这没用.

TNi*_*TNi 762

这是一种方式:

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(diffDays);
Run Code Online (Sandbox Code Playgroud)

请注意,我们需要将日期括在引号中.其余代码以毫秒为单位获取时间差,然后除以得到天数.日期需要mm/dd/yyyy格式.

  • 正如volkan在下面回答的那样,1000*3600*24是每天的毫秒数.至于总是返回一个正数,这是一个特征:)通常当一个人谈到两个日期之间的天数时,这个数字是正数.如果方向很重要,只需删除Math.abs()即可. (9认同)
  • 为了使其能够正常使用夏令时,Math.round应该替换Math.ceil.但我认为Shyam的答案是要走的路. (9认同)
  • 在计算的范围内,无法使用23小时25小时.在设计诸如此类的计算之前,咨询UTC(通用协调时间)和"民用"时间标准的详细处理将是有帮助的.一天不总是86,400秒,甚至不是UTC.但是,ECMA标准规定,它不会在UTC中每年发生两次58,59,61或62秒.您不能假设其他语言和操作系统中的纪元(1970年1月1日00:00:00)之间的偏移将是相同的,因为其中一些具有58,59,61和62秒的分钟. (8认同)
  • date已经返回的时间不需要调用.getTime() (5认同)
  • 同样,你的方法得到 1 天,因为 `getDate()` 返回日期而不考虑月份。因此,您将得到 12 - 11 = 1。 (2认同)

Shy*_*ada 691

更正确的解决方案

... 因为日期自然具有时区信息,可以跨越具有不同日光节约调整的区域

此问题的先前答案不考虑有问题的两个日期跨越夏令时(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);
Run Code Online (Sandbox Code Playgroud)

这是因为UTC时间从不观察夏令时.请参阅UTC是否遵守夏令时?

ps在讨论了关于这个答案的一些评论之后,一旦你理解了跨越DST边界的javascript日期的问题,可能不仅仅有一种方法可以解决它.我上面提供的是一个简单(和测试)的解决方案.我有兴趣知道是否有一个简单的算术/数学解决方案,而不必实例化两个新的Date对象.这可能会更快.

  • 这是唯一正确的答案,我不明白为什么其他答案如果被接受 (35认同)
  • 可能是因为@ chobo2没有回来看这个问题 (21认同)
  • 使用UTC而不是当地时区将纠正民用时间系统中23小时和25小时的问题.UTC也有58,59,61和62秒的分钟,一年两次,因此UTC的一天不会总是有86,400秒.但是,ECMA标准规定JavaScript不包含这些调整,因此在纯粹使用JavaScript工作时忽略它们.但是,其他系统不会忽略它们,并且您不能假设从纪元时刻(1970年1月1日00:00:00)的偏移量在编程语言和操作系统之间始终是相同的. (10认同)
  • 这个答案是对的.Javascript [*Date*objects](http://ecma-international.org/ecma-262/5.1/#sec-15.9)**是**UTC.使用本地值生成UTC日期将忽略夏令时,因此如果差异应该是本地的,那么将日期视为UTC将消除夏令时(因此在夏令时边界上答案可能是错误的). (7认同)
  • @Ai_boy:虽然这是最逻辑上正确的答案,但是没有任何值可以与更简单的`Math.round((b - a)/ _MS_PER_DAY,0)`匹配,因此很难支持"仅限于正确答案". (3认同)

Mat*_*int 87

这是一个使用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);
Run Code Online (Sandbox Code Playgroud)

我使用了您的原始输入值,但您没有指定格式,所以我假设第一个值是7月11日.如果打算在11月7日,那么请调整格式D/M/YYYY.

  • 干杯,我正在寻找一个瞬间的解决方案 (6认同)
  • 请注意,moment.js 是一个很大的依赖项 (2认同)

vol*_* er 30

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 )
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这个解决方案并不完全准确,因为在某些情况下,即2015-04-06减去2015-04-04给出错误的1天,所有关于parseInt()的方法. (4认同)
  • 完全不需要parseInt吗? (3认同)
  • 克里斯蒂安:他想要一个整数。parseInt 可能是最糟糕的方法。Math.round 是“正常”的方式;它舍入而不是截断。如果需要截断,'or'ing 表达式与 0 就足够了:`(date2 - date1) / (1000 * 60 * 60 * 24) | 0` (3认同)

Mik*_*s4u 12

我尝试了很多方法,发现使用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>
Run Code Online (Sandbox Code Playgroud)

在这里可以看到一个小提琴演示


Pec*_*983 7

这是从一个日期减去另一个日期的代码。此示例将日期转换为对象,因为除非是 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);
Run Code Online (Sandbox Code Playgroud)