如何得到 JavaScript 中两个日期之间的区别?

我正在创建一个应用程序,让您定义事件的时间框架。我想在用户选择或更改开始日期时自动填写结束日期。然而,我不太清楚如何得到这两个时间之间的差异,以及如何使用这个差异创建一个新的结束日期。

153197 次浏览

在 JavaScript 中,通过仅使用数值表达式中的日期调用 getTime()方法 或者,可以将日期转换为自 epoc 以来的毫秒数。

为了得到差值,只要减去两个日期。

要根据差异创建新的日期,只需在构造函数中传递毫秒数。

var oldBegin = ...
var oldEnd = ...
var newBegin = ...


var newEnd = new Date(newBegin + oldEnd - oldBegin);

This should just work

编辑 : 修正了@bdukes 指出的错误

编辑:

For an explanation of the behavior, oldBegin, oldEnd, and newBegin are Date instances. Calling operators + and - will trigger Javascript auto casting and will automatically call the valueOf() prototype method of those objects. It happens that the valueOf() method is implemented in the Date object as a call to getTime().

So basically: date.getTime() === date.valueOf() === (0 + date) === (+date)

如果使用 Date 对象,然后对两个日期都使用 getTime()函数,它将以数值的形式给出自1970年1月1日以来各自的时间。然后你可以得到这些数字之间的差异。

如果这对您没有帮助,请查看完整的文档: http://www.w3schools.com/jsref/jsref_obj_date.asp

如果您不关心时间部分,您可以使用 .getDate().setDate()来设置日期部分。

因此,为了把你的结束日期设定在开始日期后的两周,可以这样做:

function GetEndDate(startDate)
{
var endDate = new Date(startDate.getTime());
endDate.setDate(endDate.getDate()+14);
return endDate;
}

To return the difference (in days) between two dates, do this:

function GetDateDiff(startDate, endDate)
{
return endDate.getDate() - startDate.getDate();
}

最后,让我们修改第一个函数,这样它就可以将第2个返回的值作为参数:

function GetEndDate(startDate, days)
{
var endDate = new Date(startDate.getTime());
endDate.setDate(endDate.getDate() + days);
return endDate;
}

Thanks @文森特 · 罗伯特, I ended up using your basic example, though it's actually newBegin + oldEnd - oldBegin. Here's the simplified end solution:

    // 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));
}
function checkdate() {
var indate = new Date()
indate.setDate(dat)
indate.setMonth(mon - 1)
indate.setFullYear(year)


var one_day = 1000 * 60 * 60 * 24
var diff = Math.ceil((indate.getTime() - now.getTime()) / (one_day))
var str = diff + " days are remaining.."
document.getElementById('print').innerHTML = str.fontcolor('blue')
}

当您输入学习的开始日期和结束日期(合格的确定日期)并检查学习时间是否少于一年时,如果是,则填写学习年限 记住有三个输入元素,第一个 txtFromQualifDate和第二个 txtQualifDate和第三个 txtStudyYears

它将用分数表示年数的结果

function getStudyYears()
{
if(document.getElementById('txtFromQualifDate').value != '' && document.getElementById('txtQualifDate').value != '')
{
var d1 = document.getElementById('txtFromQualifDate').value;


var d2 = document.getElementById('txtQualifDate').value;


var one_day=1000*60*60*24;


var x = d1.split("/");
var y = d2.split("/");


var date1=new Date(x[2],(x[1]-1),x[0]);


var date2=new Date(y[2],(y[1]-1),y[0])


var dDays = (date2.getTime()-date1.getTime())/one_day;


if(dDays < 365)
{
alert("the date between start study and graduate must not be less than a year !");


document.getElementById('txtQualifDate').value = "";
document.getElementById('txtStudyYears').value = "";


return ;
}


var dMonths = Math.ceil(dDays / 30);


var dYears = Math.floor(dMonths /12) + "." + dMonths % 12;


document.getElementById('txtStudyYears').value = dYears;
}
}

根据您的需要,此函数将计算两天之间的差额,并以小数点后的天数返回结果。

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

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 对象的威力,但它实际上似乎是一个定时炸弹

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

See JsFiddle DEMO

    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>

可选修改扩展代码。

Http://jsfiddle.net/vvgpq/48/

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);
}
<html>
<head>
<script>
function dayDiff()
{
var start = document.getElementById("datepicker").value;
var end= document.getElementById("date_picker").value;
var oneDay = 24*60*60*1000;
var firstDate = new Date(start);
var secondDate = new Date(end);
var diffDays = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
document.getElementById("leave").value =diffDays ;
}
</script>
</head>
<body>
<input type="text" name="datepicker"value=""/>
<input type="text" name="date_picker" onclick="function dayDiff()" value=""/>
<input type="text" name="leave" value=""/>
</body>
</html>

If using moment.js, there is a simpler solution, which will give you the difference in days in one single line of code.

moment(endDate).diff(moment(beginDate), 'days');

更多细节可以在 Moment.js 页面中找到

干杯, Miguel

下面的代码将返回从今天到期货日期的剩余天数。

依赖关系: JQuery 和 MomentJs。

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');
var getDaysLeft = function (date1, date2) {
var daysDiffInMilliSec = Math.abs(new Date(date1) - new Date(date2));
var daysLeft = daysDiffInMilliSec / (1000 * 60 * 60 * 24);
return daysLeft;
};
var date1='2018-05-18';
var date2='2018-05-25';
var dateDiff = getDaysLeft(date1, date2);
console.log(dateDiff);

这是我在我的系统里做的。

var startTime=("08:00:00").split(":");
var endTime=("16:00:00").split(":");
var HoursInMinutes=((parseInt(endTime[0])*60)+parseInt(endTime[1]))-((parseInt(startTime[0])*60)+parseInt(startTime[1]));
console.log(HoursInMinutes/60);

以毫秒为单位获取两个日期之间的日期差:

var diff = Math.abs(date1 - date2);

我不知道你说的把差额转换回日期是什么意思。