获取 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.ceil
或Math.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 中两个日期之间的差异? [复制]的主要内容,如果未能解决你的问题,请参考以下文章