我正在创建一个应用程序,它可以让您定义具有时间范围的事件。我想在用户选择或更改开始日期时自动填写结束日期。但是,我无法弄清楚如何获得两次之间的差异,然后如何使用该差异创建新的结束日期。
如何获得 JavaScript 中两个日期之间的差异?
IT技术
javascript
date
2021-01-30 16:58:40
6个回答
在 JavaScript 中,可以通过调用该getTime()
方法或仅在数字表达式中使用日期将日期转换为自 epoc 以来的毫秒数。
所以要得到差异,只需减去两个日期。
要根据差异创建新日期,只需在构造函数中传递毫秒数。
var oldBegin = ...
var oldEnd = ...
var newBegin = ...
var newEnd = new Date(newBegin + oldEnd - oldBegin);
这应该只是工作
编辑:修正了@bdukes 指出的错误
编辑:
对于行为的解释oldBegin
,oldEnd
、 和newBegin
是Date
实例。调用操作符+
和-
会触发 Javascript 自动转换,并会自动调用valueOf()
这些对象的原型方法。碰巧该valueOf()
方法在Date
对象中实现为对 的调用getTime()
。
所以基本上: date.getTime() === date.valueOf() === (0 + date) === (+date)
JavaScript 完美支持开箱即用的日期差异
https://jsfiddle.net/b9chris/v5twbe3h/
var msMinute = 60*1000,
msDay = 60*60*24*1000,
a = new Date(2012, 2, 12, 23, 59, 59),
b = new Date("2013 march 12");
console.log(Math.floor((b - a) / msDay) + ' full days between'); // 364
console.log(Math.floor(((b - a) % msDay) / msMinute) + ' full minutes between'); // 0
现在有些陷阱。试试这个:
console.log(a - 10); // 1331614798990
console.log(a + 10); // mixed string
因此,如果您有添加数字和日期的风险,请number
直接将日期转换为。
console.log(a.getTime() - 10); // 1331614798990
console.log(a.getTime() + 10); // 1331614799010
我的第一个例子展示了 Date 对象的力量,但它实际上似乎是一个定时炸弹
var date1 = new Date();
var date2 = new Date("2025/07/30 21:59:00");
//Customise date2 for your required future time
showDiff();
function showDiff(date1, date2){
var diff = (date2 - date1)/1000;
diff = Math.abs(Math.floor(diff));
var days = Math.floor(diff/(24*60*60));
var leftSec = diff - days * 24*60*60;
var hrs = Math.floor(leftSec/(60*60));
var leftSec = leftSec - hrs * 60*60;
var min = Math.floor(leftSec/(60));
var leftSec = leftSec - min * 60;
document.getElementById("showTime").innerHTML = "You have " + days + " days " + hrs + " hours " + min + " minutes and " + leftSec + " seconds before death.";
setTimeout(showDiff,1000);
}
为您的 HTML 代码:
<div id="showTime"></div>
如果您不关心时间部分,您可以使用.getDate()
和.setDate()
来设置日期部分。
因此,要将结束日期设置为开始日期后 2 周,请执行以下操作:
function GetEndDate(startDate)
{
var endDate = new Date(startDate.getTime());
endDate.setDate(endDate.getDate()+14);
return endDate;
}
要返回两个日期之间的差异(以天为单位),请执行以下操作:
function GetDateDiff(startDate, endDate)
{
return endDate.getDate() - startDate.getDate();
}
最后,让我们修改第一个函数,使其可以将 2nd 返回的值作为参数:
function GetEndDate(startDate, days)
{
var endDate = new Date(startDate.getTime());
endDate.setDate(endDate.getDate() + days);
return endDate;
}
谢谢@ Vincent Robert,我最终使用了您的基本示例,尽管它实际上是newBegin + oldEnd - oldBegin
. 这是简化的最终解决方案:
// don't update end date if there's already an end date but not an old start date
if (!oldEnd || oldBegin) {
var selectedDateSpan = 1800000; // 30 minutes
if (oldEnd) {
selectedDateSpan = oldEnd - oldBegin;
}
newEnd = new Date(newBegin.getTime() + selectedDateSpan));
}