代码之家  ›  专栏  ›  技术社区  ›  bdukes Jon Skeet

如何在JavaScript中获得两个日期之间的差异?

  •  101
  • bdukes Jon Skeet  · 技术社区  · 16 年前

    16 回复  |  直到 16 年前
        1
  •  79
  •   Vincent Robert    11 年前

    getTime() 方法

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

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

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

    这应该行得通

    编辑

    编辑 :

    oldBegin , oldEnd newBegin Date 实例。呼叫接线员 + - 将触发Javascript自动转换并自动调用 valueOf() 这些对象的原型方法。碰巧 方法在 日期 对象作为对 getTime() .

    date.getTime() === date.valueOf() === (0 + date) === (+date)

        2
  •  27
  •   Chris Moschini    4 年前

    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
    

        3
  •  10
  •   Vipul Solanki tika    6 年前

    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>
    
        4
  •  5
  •   Sid M Vladimir Enchev    10 年前

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

    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;
    }
    
        5
  •  4
  •   Community CDub    7 年前

    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));
        }
    
        6
  •  3
  •   sparkyspider    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));
    }
    
        7
  •  2
  •   Miguel Guardo    8 年前

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

    更多详细信息请参见 moment.js page

    米格尔

        8
  •  1
  •   Phil Bozak    11 年前
    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);
    }
    
        9
  •  1
  •   NovaYear    10 年前

    替代修改扩展代码。。

    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);
    }
    
        10
  •  1
  •   Sukanya Suku    9 年前
    <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>
    
        11
  •  1
  •   StaceyGirl    6 年前

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

    依赖项:

    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');
    
        12
  •  1
  •   Vin S    6 年前
    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);
    
        13
  •  0
  •   bdukes Jon Skeet    14 年前
    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')
    }
    
        14
  •  0
  •   Alexander Elgin    9 年前

    记住有三个输入元素第一个 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;
            }
        }
    
        15
  •  0
  •   Alexander Elgin    9 年前

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

    http://www.w3schools.com/jsref/jsref_obj_date.asp

        16
  •  0
  •   Sean Cortez    6 年前

    这就是我在我的系统上所做的。

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