我正在创建一个能够定义事件时间范围的应用程序。我希望当用户选择或更改开始日期时,自动填充结束日期。然而,我还不太清楚如何获取两个时间之间的差异,并使用该差异创建一个新的结束日期。
我正在创建一个能够定义事件时间范围的应用程序。我希望当用户选择或更改开始日期时,自动填充结束日期。然而,我还不太清楚如何获取两个时间之间的差异,并使用该差异创建一个新的结束日期。
getTime()
方法或将日期用于数值表达式来将日期转换为自纪元以来的毫秒数。 因此,要获取差异,只需减去两个日期。 要根据差异创建新日期,只需在构造函数中传递毫秒数。var oldBegin = ...
var oldEnd = ...
var newBegin = ...
var newEnd = new Date(newBegin + oldEnd - oldBegin);
这应该只是有效的。
编辑: 修复了@bdukes指出的错误。
编辑:
关于行为的说明,oldBegin
,oldEnd
和newBegin
都是Date
实例。调用运算符+
和-
将触发JavaScript自动转换并自动调用这些对象的valueOf()
原型方法。恰巧,在Date
对象中实现了valueOf()
方法作为对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();
}
function GetEndDate(startDate, days)
{
var endDate = new Date(startDate.getTime());
endDate.setDate(endDate.getDate() + days);
return endDate;
}
GetDateDiff()
会跨越月份边界。例如,2011/04/26 和 2011/05/01 将返回 -25,但偏差应为 5 天。 - nfm感谢@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));
}
getTime
,有时候又不用,这是一个很好的观点。 - Dan根据您的需求,此函数将计算2天之间的差异,并以天为单位返回结果。
// This one returns a signed decimal. The sign indicates past or future.
this.getDateDiff = function(date1, date2) {
return (date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24);
}
// This one always returns a positive decimal. (Suggested by Koen below)
this.getDateDiff = function(date1, date2) {
return Math.abs((date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24));
}
Math.abs()
调用中,您将始终获得一个正的十进制数。 - Koen.var nextMinute = new Date( someDate.getTime() + 60 * 1000 );
- Danmoment(endDate).diff(moment(beginDate), 'days');
更多详细信息请参见moment.js页面
祝好, 米格尔
var getDaysLeft = function (date) {
var today = new Date();
var daysLeftInMilliSec = Math.abs(new Date(moment(today).format('YYYY-MM-DD')) - new Date(date));
var daysLeft = daysLeftInMilliSec / (1000 * 60 * 60 * 24);
return daysLeft;
};
getDaysLeft('YYYY-MM-DD');
function compare()
{
var end_actual_time = $('#date3').val();
start_actual_time = new Date();
end_actual_time = new Date(end_actual_time);
var diff = end_actual_time-start_actual_time;
var diffSeconds = diff/1000;
var HH = Math.floor(diffSeconds/3600);
var MM = Math.floor(diffSeconds%3600)/60;
var formatted = ((HH < 10)?("0" + HH):HH) + ":" + ((MM < 10)?("0" + MM):MM)
getTime(diffSeconds);
}
function getTime(seconds) {
var days = Math.floor(leftover / 86400);
//how many seconds are left
leftover = leftover - (days * 86400);
//how many full hours fits in the amount of leftover seconds
var hours = Math.floor(leftover / 3600);
//how many seconds are left
leftover = leftover - (hours * 3600);
//how many minutes fits in the amount of leftover seconds
var minutes = leftover / 60;
//how many seconds are left
//leftover = leftover - (minutes * 60);
alert(days + ':' + hours + ':' + minutes);
}
替代修改扩展代码...
showDiff();
function showDiff(){
var date1 = new Date("2013/01/18 06:59:00");
var date2 = new Date();
//Customise date2 for your required future time
var diff = (date2 - date1)/1000;
var diff = Math.abs(Math.floor(diff));
var years = Math.floor(diff/(365*24*60*60));
var leftSec = diff - years * 365*24*60*60;
var month = Math.floor(leftSec/((365/12)*24*60*60));
var leftSec = leftSec - month * (365/12)*24*60*60;
var days = Math.floor(leftSec/(24*60*60));
var leftSec = leftSec - 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 " + years + " years "+ month + " month " + days + " days " + hrs + " hours " + min + " minutes and " + leftSec + " seconds the life time has passed.";
setTimeout(showDiff,1000);
}