首页 文章

Javascript返回两个日期之间的天数,小时数,分钟数,秒数

提问于
浏览
44

有没有人可以链接我的一些教程,我可以找到如何在2个unix日期之间的javascript中返回天,小时,分钟,秒?

我有:

var date_now = unixtimestamp;
var date_future = unixtimestamp;

我想返回(实时)从date_now到date_future的剩余天数,小时数,分钟数 .

11 回答

  • 3

    只需计算出以秒为单位的差异(不要忘记JS时间戳实际上以毫秒为单位)并分解该值:

    // get total seconds between the times
    var delta = Math.abs(date_future - date_now) / 1000;
    
    // calculate (and subtract) whole days
    var days = Math.floor(delta / 86400);
    delta -= days * 86400;
    
    // calculate (and subtract) whole hours
    var hours = Math.floor(delta / 3600) % 24;
    delta -= hours * 3600;
    
    // calculate (and subtract) whole minutes
    var minutes = Math.floor(delta / 60) % 60;
    delta -= minutes * 60;
    
    // what's left is seconds
    var seconds = delta % 60;  // in theory the modulus is not required
    

    EDIT 代码已经调整,因为我刚刚意识到原始代码返回了总小时数等,而不是整天计算后剩余的小时数 .

  • 1

    这里是javascript :(例如,未来的日期是新年)

    DEMO (每秒更新)

    var dateFuture = new Date(new Date().getFullYear() +1, 0, 1);
    var dateNow = new Date();
    
    var seconds = Math.floor((dateFuture - (dateNow))/1000);
    var minutes = Math.floor(seconds/60);
    var hours = Math.floor(minutes/60);
    var days = Math.floor(hours/24);
    
    hours = hours-(days*24);
    minutes = minutes-(days*24*60)-(hours*60);
    seconds = seconds-(days*24*60*60)-(hours*60*60)-(minutes*60);
    
  • 0

    我称之为"snowman-carl ☃ method",我认为当你需要额外的时间 Span ,如周,飞蛾,年,几个世纪时,它会更灵活一点......并且不需要太多的重复代码:

    var d = Math.abs(date_future - date_now) / 1000;                           // delta
    var r = {};                                                                // result
    var s = {                                                                  // structure
        year: 31536000,
        month: 2592000,
        week: 604800, // uncomment row to ignore
        day: 86400,   // feel free to add your own row
        hour: 3600,
        minute: 60,
        second: 1
    };
    
    Object.keys(s).forEach(function(key){
        r[key] = Math.floor(d / s[key]);
        d -= r[key] * s[key];
    });
    
    // for example: {year:0,month:0,week:1,day:2,hour:34,minute:56,second:7}
    console.log(r);
    

    拥有FIDDLE / ES6版本(2018)/ TypeScript版本(2019)

    灵感来自Alnitak的回答 .

  • 19

    请注意,仅根据差异进行计算不会涵盖所有情况:闰年和“夏令时”的切换 .

    Javascript用于处理日期的内置库很差 . 我建议你使用第三方javascript库,例如MomentJS;你可以看到here你正在寻找的功能 .

  • 26

    我知道持续时间细分的最佳库是countdown.js . 它处理所有困难情况,如闰年和夏令时csg mentioned,甚至允许您指定模糊概念,如月和周 . 这是您案例的代码:

    //assuming these are in *seconds* (in case of MS don't multiply by 1000 below)
    var date_now = 1218374; 
    var date_future = 29384744;
    
    diff = countdown(date_now * 1000, date_future * 1000, 
                countdown.DAYS | countdown.HOURS | countdown.MINUTES | countdown.SECONDS);
    alert("days: " + diff.days + " hours: " + diff.hours + 
          " minutes: " + diff.minutes + " seconds: " + diff.seconds);
    
    //or even better
    alert(diff.toString());
    

    这是一个JSFiddle,但它可能仅适用于禁用Web安全的FireFox或Chrome,因为countdown.js托管文本/纯MIME类型(您应该提供文件,而不是链接到countdownjs.org) .

  • 1
    function update(datetime = "2017-01-01 05:11:58") {
        var theevent = new Date(datetime);
        now = new Date();
        var sec_num = (theevent - now) / 1000;
        var days    = Math.floor(sec_num / (3600 * 24));
        var hours   = Math.floor((sec_num - (days * (3600 * 24)))/3600);
        var minutes = Math.floor((sec_num - (days * (3600 * 24)) - (hours * 3600)) / 60);
        var seconds = Math.floor(sec_num - (days * (3600 * 24)) - (hours * 3600) - (minutes * 60));
    
        if (hours   < 10) {hours   = "0"+hours;}
        if (minutes < 10) {minutes = "0"+minutes;}
        if (seconds < 10) {seconds = "0"+seconds;}
    
        return  days+':'+ hours+':'+minutes+':'+seconds;
    }
    
  • 8

    这是一个代码示例 . 我使用简单的计算而不是使用预先计算,如1天是86400秒 . 所以你可以轻松地遵循逻辑 .

    // Calculate time between two dates:
    var date1 = new Date('1110-01-01 11:10');
    var date2 = new Date();
    
    console.log('difference in ms', date1 - date2);
    
    // Use Math.abs() so the order of the dates can be ignored and you won't
    // end up with negative numbers when date1 is before date2.
    console.log('difference in ms abs', Math.abs(date1 - date2));
    console.log('difference in seconds', Math.abs(date1 - date2) / 1000);
    
    var diffInSeconds = Math.abs(date1 - date2) / 1000;
    var days = Math.floor(diffInSeconds / 60 / 60 / 24);
    var hours = Math.floor(diffInSeconds / 60 / 60 % 24);
    var minutes = Math.floor(diffInSeconds / 60 % 60);
    var seconds = Math.floor(diffInSeconds % 60);
    var milliseconds = Math.round((diffInSeconds - Math.floor(diffInSeconds)) * 1000);
    
    console.log('days', days);
    console.log('hours', ('0' + hours).slice(-2));
    console.log('minutes', ('0' + minutes).slice(-2));
    console.log('seconds', ('0' + seconds).slice(-2));
    console.log('milliseconds', ('00' + milliseconds).slice(-3));
    
  • 0

    使用moment.js库,例如:

    var time = date_future - date_now;
    var seconds = moment.duration(time).seconds();
    var minutes = moment.duration(time).minutes();
    var hours   = moment.duration(time).hours();
    var days    = moment.duration(time).days();
    
  • 124

    这是一个代码,用于查找天,小时,分钟,秒中两个日期之间的差异(假设未来日期是新年日期) .

    var one_day = 24*60*60*1000;              // total milliseconds in one day
    
    var today = new Date();
    var new_year = new Date("01/01/2017");    // future date
    
    var today_time = today.getTime();         // time in miliiseconds
    var new_year_time = new_year.getTime();                         
    
    var time_diff = Math.abs(new_year_time - today_time);  //time diff in ms  
    var days = Math.floor(time_diff / one_day);            // no of days
    
    var remaining_time = time_diff - (days*one_day);      // remaining ms  
    
    var hours = Math.floor(remaining_time/(60*60*1000));   
    remaining_time = remaining_time - (hours*60*60*1000);  
    
    var minutes = Math.floor(remaining_time/(60*1000));        
    remaining_time = remaining_time - (minutes * 60 * 1000);   
    
    var seconds = Math.ceil(remaining_time / 1000);
    
  • 1
    let delta = Math.floor(Math.abs(start.getTime() - end.getTime()) / 1000);
    let hours = Math.floor(delta / 3600);
    delta -= hours * 3600;
    let minutes = Math.floor(delta / 60);
    delta -= minutes * 60;
    let seconds = delta;
    if (hours.toString().length === 1) {
      hours = `0${hours}`;
    }
    if (minutes.toString().length === 1) {
      minutes = `0${minutes}`;
    }
    if (seconds.toString().length === 1) {
      seconds = `0${seconds}`;
    }
    const recordingTime = `${hours}:${minutes}:${seconds}`;
    
  • 0

    Short and flexible with support for negative values ,虽然使用两个逗号表达式:)

    function timeUnitsBetween(startDate, endDate) {
      let delta = Math.abs(endDate - startDate) / 1000;
      const isNegative = startDate > endDate ? -1 : 1;
      return [
        ['days', 24 * 60 * 60],
        ['hours', 60 * 60],
        ['minutes', 60],
        ['seconds', 1]
      ].reduce((acc, [key, value]) => (acc[key] = Math.floor(delta / value) * isNegative, delta -= acc[key] * isNegative * value, acc), {});
    }
    

    Example:

    timeUnitsBetween(new Date("2019-02-11T02:12:03+00:00"), new Date("2019-02-11T01:00:00+00:00"));
    // { days: -0, hours: -1, minutes: -12, seconds: -3 }
    

    RienNeVaPlu͢s解决方案的启发 .

相关问题