如何获取JavaScript中两个日期之间的区别?

如何获取JavaScript中两个日期之间的区别?

How do I get the difference between two Dates in JavaScript?

我正在创建一个应用程序,可让您定义带有时间范围的事件。 我想在用户选择或更改开始日期时自动填写结束日期。 但是,我不太清楚如何获得两次之间的差异,然后如何使用该差异创建新的结束日期。


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

因此,要获得差异,只需减去两个日期。

要基于差异创建新日期,只需在构造函数中传递毫秒数即可。

1
2
3
4
5
var oldBegin = ...
var oldEnd = ...
var newBegin = ...

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

这应该工作

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

编辑:

对于行为的解释,oldBeginoldEndnewBeginDate实例。调用运算符+-将触发Javascript自动转换,并将自动调用这些对象的valueOf()原型方法。碰巧valueOf()方法在Date对象中实现为对getTime()的调用。

所以基本上:date.getTime() === date.valueOf() === (0 + date) === (+date)


JavaScript完美支持开箱即用的日期差

1
2
3
4
5
6
7
8
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');
console.log(Math.floor(((b - a) % msDay) / msMinute) + ' full minutes between');

现在有一些陷阱。尝试这个:

1
2
console.log(a - 10);
console.log(a + 10);

因此,如果您有添加数字和日期的风险,请将日期直接转换为number

1
2
console.log(a.getTime() - 10);
console.log(a.getTime() + 10);

我的第一个例子演示了Date对象的功能,但实际上似乎是定时炸弹


参见JsFiddle演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    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代码:

1
 

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

因此,要将结束日期设置为开始日期之后的2周,请执行以下操作:

1
2
3
4
5
6
function GetEndDate(startDate)
{
    var endDate = new Date(startDate.getTime());
    endDate.setDate(endDate.getDate()+14);
    return endDate;
}

要返回两个日期之间的时差(以天为单位),请执行以下操作:

1
2
3
4
function GetDateDiff(startDate, endDate)
{
    return endDate.getDate() - startDate.getDate();
}

最后,让我们修改第一个函数,使其可以将2nd返回的值用作参数:

1
2
3
4
5
6
function GetEndDate(startDate, days)
{
    var endDate = new Date(startDate.getTime());
    endDate.setDate(endDate.getDate() + days);
    return endDate;
}

感谢@Vincent Robert,我最终使用了您的基本示例,尽管它实际上是newBegin + oldEnd - oldBegin。这是简化的最终解决方案:

1
2
3
4
5
6
7
8
9
    // 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));
    }

根据您的需要,此函数将计算两天之间的差,并以十进制天为单位返回结果。

1
2
3
4
5
6
7
8
9
10
11
// 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));
}


如果使用moment.js,则有一个更简单的解决方案,它将在一行代码中为您带来几天的差异。

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

其他细节可以在moment.js页面中找到

干杯,
米格尔


替代修改扩展代码

http://jsfiddle.net/vvGPQ/48/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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);
}

这就是我在系统上执行的操作。

1
2
3
4
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);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<html>
<head>

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

</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>


当您输入学习的开始日期和结束日期(合格日期)并检查持续时间是否少于一年(如果是)时,此代码将填满学习年限
请记住,有三个输入元素,第一个txtFromQualifDate和第二个txtQualifDate以及第三个txtStudyYears

它将显示分数的年数结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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;
        }
    }

1
2
3
4
5
6
7
8
9
10
11
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')
}

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

依赖关系:jQuery和MomentJs。

1
2
3
4
5
6
7
8
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');

1
2
3
4
5
6
7
8
9
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);

如果使用Date对象,然后对两个日期都使用getTime()函数,它将为您提供自1970年1月1日以来的数字值。然后,您可以获取这些数字之间的差。

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


推荐阅读

    linux下用户权限命令?

    linux下用户权限命令?,管理,系统,密码,地址,权限,时间,基础,信息,基本知识,

    linux用户名改名命令?

    linux用户名改名命令?,系统,密码,命令,代码,名称,用户名,用户,终端,主机名,

    linux用户分组命令?

    linux用户分组命令?,系统,命令,电脑,信息,时间,标准,资料,用户,文件,用户组,L

    linux切换日期命令?

    linux切换日期命令?,时间,系统,信息,命令,城市,终端,时分,日期,窗口,操作系

    linux命令改用户所属?

    linux命令改用户所属?,系统,文件,名称,用户组,命令,用户,名录,基本知识,所

    linux系统用户组命令?

    linux系统用户组命令?,系统,管理,密码,代码,用户组,用户,命令,邮箱,电脑,名

    linux用户管理的命令?

    linux用户管理的命令?,系统,管理,信息,地址,工作,用户,单位,基础,数据,命令,L

    linux用户退出命令行?

    linux用户退出命令行?,状态,档案,标准,系统,命令,文件,模式,编辑,指令,主机,l

    linux用户自定义命令?

    linux用户自定义命令?,系统,时间,标准,软件,项目,电脑,服务,工具,基本知识,

    linux用户组命令设置?

    linux用户组命令设置?,管理,系统,密码,代码,电脑,用户组,用户,软件,新增,命

    linux进入用户命令行?

    linux进入用户命令行?,系统,地址,工作,服务,信息,命令,首页,电脑,密码,终端,L

    linux用户用不了命令?

    linux用户用不了命令?,系统,档案,不了,命令,网络,密码,信息,情况,用户,权限,l

    linux新增用户组命令?

    linux新增用户组命令?,系统,密码,新增,用户组,联系方式,软件,邮箱,工具,管

    linux显示用户名命令?

    linux显示用户名命令?,密码,系统,信息,时间,地址,命令,用户,用户名,位置,用

    linux用户常用命令?

    linux用户常用命令?,工作,地址,系统,信息,管理,目录,命令,标准,基础,常用命

    linux登陆用户的命令?

    linux登陆用户的命令?,系统,密码,工作,用户,命令,代码,第三,信息,分时,用户

    linux根用户登录命令?

    linux根用户登录命令?,系统,密码,软件,状态,地址,合法,电脑,位置,检测,工具,L

    linux命令切换用户组?

    linux命令切换用户组?,密码,系统,用户组,命令,用户,文件,信息,目录,终端,所

    linux修改日期命令?

    linux修改日期命令?,时间,系统,命令,信息,工具,工作,服务,代码,日期,终端,lin

    linux命令列出用户名?

    linux命令列出用户名?,信息,地址,时间,系统,网络,命令,用户,数据,状态,管理,L