获取 JavaScript 中两个日期之间的差异? [复制]

Posted

技术标签:

【中文标题】获取 JavaScript 中两个日期之间的差异? [复制]【英文标题】:Get difference between 2 dates in JavaScript? [duplicate] 【发布时间】:2011-03-14 13:57:41 【问题描述】:

如何获得 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 解析的字符串,或者更确切地说,使用three numeric values 作为new Date 的参数,例如new Date(2010, 11, 7);. 旁注:永远不要相信客户端的系统时间!它经常出错,您可能会破坏您的应用程序。 另外,试试***.com/a/53092438/3787376的一个小功能。 @Edward,你真的称其为 SMALL 函数吗? :) 这是无法解决的。 1) 2010 年 7 月 11 日可能是 7 月 11 日或 11 月 7 日。 2)什么时区?这可能跨越日期。 3)没有时间,精度为+/- 1天。 4)结果可能是 - 当它真的是积极的(反之亦然)因为没有时间/时区 【参考方案1】:

Here is one way:

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()。 同样,您的方法会得到 1 天,因为 getDate() 会返回当天而不考虑月份。因此,你会得到 12 - 11 = 1。 日期已经返回时间不需要调用.getTime() 为了在夏令时正常工作,Math.round 应该替换 Math.ceil。但我认为 Shyam 的答案是正确的方法。 在计算的跨度中不能使用 23 小时 25 小时的一天。在设计这样的计算之前,咨询对 UTC(通用协调时间)和“民用”时间标准的详细处理会很有帮助。一天并不总是 86,400 秒,即使在 UTC 中也是如此。但是,ECMA 标准规定它不会有 58、59、61 或 62 秒的分钟数,在 UTC 中每年最多出现两次。您不能假设在其他语言和操作系统中与纪元(1970 年 1 月 1 日 00:00:00 小时)的偏移量相同,因为其中一些具有 58、59、61 和 62 秒分钟。【参考方案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。见Does UTC observe daylight saving time?

附言在讨论了有关此答案的一些 cmets 之后,一旦您了解了跨越 DST 边界的 javascript 日期的问题,解决它的方法可能不止一种。我上面提供的是一个简单(并且经过测试)的解决方案。我很想知道是否有一个简单的基于算术/数学的解决方案,而不必实例化两个新的 Date 对象。这可能会更快。

【讨论】:

这是唯一正确的答案,我不明白为什么其他答案如果被接受 可能是因为@chobo2没有回来看这个问题 @Ai_boy:虽然这是逻辑上最正确的答案,但没有任何值无法匹配更简单的Math.round((b - a)/ _MS_PER_DAY, 0),因此很难支持“唯一正确的答案”。 @ShyamHabarakada:这是Math.ceilMath.floor 技术的问题,但由于夏令时仅从24 小时制调整一小时,它将被Math.round 吞噬.我没有详尽地测试过,但我看不出两者会不同意的情况。你可以吗?我们实际上是在 18347050 中讨论这个问题,这就是我遇到这个旧线程的方式,我在那里提出了夏令时。 使用 UTC 代替本地时区将更正民用时间系统中由 23 小时和 25 小时制引起的问题。 UTC 也有 58、59、61 和 62 秒分钟,最多一年两次,因此 UTC 中的一天并不总是有 86,400 秒。然而,ECMA 标准规定 JavaScript 没有包含这些调整,因此在纯粹使用 JavaScript 工作时忽略它们。但是,其他系统不会忽略它们,并且您不能假设从纪元时刻(1970 年 1 月 1 日 00:00:00)开始的偏移量在编程语言和操作系统之间总是相同的。【参考方案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

【讨论】:

干杯,我正在寻找 momentjs 解决方案 @Matt Johnson:我需要找到确切的差异,我的意思是,从这个时间到未来日期的剩余天数、小时数、分钟数和秒数?该怎么做? @ImdadAli - 见***.com/a/41876250/634824。 请注意,moment.js 是一个很大的依赖项【参考方案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) => 毫秒到天 难道 parseInt 不是完全没有必要的吗? Christian:他想要一个整数。 parseInt 可能是最糟糕的方法。 Math.round 是“正常”的方式;它舍入而不是截断。如果需要截断,用 0 对表达式进行 'or'ing 就足够了:(date2 - date1) / (1000 * 60 * 60 * 24) | 0 请注意,此解决方案并不完全准确,因为在某些情况下,即 2015-04-06 减去 2015-04-04 给出了错误的 1 天,全部与 parseInt() 方法有关。 @ontananza var date1 = new Date("2015-04-04"); var date2 = new Date("2015-04-06"); parseInt((date2 - date1) / (1000 * 60 * 60 * 24)); 为我产生 2【参考方案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 日期选择器,那么它会失败。【参考方案6】:

这是从另一个日期中减去一个日期的代码。此示例将日期转换为对象,因为 getTime() 函数将不起作用,除非它是 Date 对象。

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

【讨论】:

以上是关于获取 JavaScript 中两个日期之间的差异? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用javascript查找两个日期之间的天数差异

从 2 个 REF 列中获取两个日期之间的差异

如何获取 MySQL 上两个日期之间的差异天数?

Javascript和datediff mysql中日期之间的日期差异不相等

如何在jquery中以秒为单位获取两个日期之间的差异?

Kotlin:获取两个日期之间的差异(现在和以前的日期)