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


110

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

Answers:


72

在JavaScript中,日期可通过调用转化为由于EPOC毫秒数getTime()方法仅在数字表达式中使用日期,将日期数。

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

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

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

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

这应该工作

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

编辑

对于行为的解释,oldBeginoldEnd,和newBeginDate实例。调用运营商+-触发的Javascript汽车铸件,并会自动调用valueOf()这些对象的原型方法。碰巧该valueOf()方法在Date对象中实现为对的调用getTime()

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


.getTime()工作所需的格式是什么...例如-new Date('22 -12-2012 00:00')。getTime()将无法工作...有什么想法吗?
Jimmyt1988

1
对于JS中的日期解析,我建议您看一下以下问题:stackoverflow.com/questions/1576753/…–
文森特·罗伯特

8
OldBegin,oldEnd和NewBegin应该是Date对象吗?很难说出它们应该是什么类型的对象,因为这里省略了变量声明。
安德森·格林

此外,还有一个函数可用于在JavaScript中添加或减去日期:stackoverflow.com/a/1214753/975097
Anderson Green

加上数字和天数时要小心。请参阅下面的答案以获取解释
2013年

24

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

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

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

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

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

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

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


丹,我发现您的示例最容易理解和遵循。谢谢。
梅勒妮

5
实际上,“陷阱”是基于语言规范的默认设置。减法运算符-将参数强制为number,因此Date返回其时间值。该+操作符被重载,所以可能会做加法,强迫数或级联。由于在这种情况下Dates强制转换为String,因此请进行+串联。混淆不是Date对象的错,而是操作符重载。
RobG '16

9

参见JsFiddle演示

    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>

4

如果您不关心时间部分,可以使用.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;
}

31
GetDateDiff()将突破月份障碍。例如,2011/04/26和2011/05/01将返回-25,但偏移量应为5天。
nfm

var ds = new Date(2014,0,31,0,0,0,0); var de = new Date(2014,2,31,0,0,0,0); GetDateDiff(ds,de)返回0
Noor

3

谢谢@ 文森特·罗伯特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));
    }

1
解释一下为什么有时使用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));
}

1
将其置于Math.abs()通话中,您将始终得到一个正的小数。
科恩

1
尼斯建议科恩。这给了人们2个选择:仅是您所建议的真实日期差异,或者是带有符号的datediff,指示差异是过去还是将来。:)
sparkyspider 2012年

请注意,在JavaScript中,您还可以添加/减去毫秒数date.getTime()来获取将来/过去的时间。`var nextMinute = new Date(someDate.getTime()+ 60 * 1000);
2013年

这是错字吗?“两天之间”。大概在2个日期之间。
tomazahlin


1
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

替代修改扩展代码

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

请进一步说明您的答案,并使用更好的英语。
基金莫妮卡的诉讼

此解决方案是错误的,因为您使用365天而忽略了leap年。
Sergey Goliney

0
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')
}

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

0

这段代码填补了研究多年的时间,当您输入开始日期和学习结束日期(资格计提坏账日期),检查时间不到一年的时间,如果是警报的消息采取心中有三种输入要素的第一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;
        }
    }

1
绝对不要解析日期字符串来查找年份,因为浏览器之间的字符串外观(尤其是分隔符)会有所不同。getFullYear为此用途而设计的。-------参见googlecode上datejs库,它可能支持最极端情况

感谢@Dan的建议,但它在真正的政府项目(不同的浏览器)上为我工作并进行了测试,是不是编程能力很弱?:)
shareef 2013年

0

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

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


哦,是的,没有注意到,低于此答案的答案最多半年。
科恩

0

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

依赖关系: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');

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

0

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

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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.