【问题标题】:calculate time difference between two date in HH:MM:SS javascript计算 HH:MM:SS javascript 中两个日期之间的时间差
【发布时间】:2014-10-27 02:52:14
【问题描述】:

我在 javascript 中创建了一个计时器应用程序。 首先,它需要当前的 UTC 日期来启动计时器并提供一些参考。这是代码

on_timer: function(e) {
            var self = this;
            if ($(e.target).hasClass("pt_timer_start")) {
                var current_date = this.get_current_UTCDate();
                this.project_timesheet_db.set_current_timer_activity({date: current_date});
                this.start_interval();
                this.initialize_timer();
                this.$el.find(".pt_timer_start,.pt_timer_stop").toggleClass("o_hidden");

现在,一旦计时器启动,并且在一段时间后,计时器将参考上述on_timer: function(e) 函数经过一段时间。

这个函数是

start_interval: function() {
            var timer_activity = this.project_timesheet_db.get_current_timer_activity();
            var self = this;
            this.intervalTimer = setInterval(function(){
                self.$el.find(".pt_duration").each(function() {
                    var el_hour = $(this).find("span.hours");
                    var el_minute = $(this).find("span.minutes");
                    var minute = parseInt(el_minute.text());
                    if(minute >= 60) {
                        el_hour.text(_.str.sprintf("%02d", parseInt(el_hour.text()) + 1));
                        minute = 0;
                    }
                    el_minute.text(_.str.sprintf("%02d", minute));
                    var el_second = $(this).find("span.seconds");
                    var seconds = parseInt(el_second.text()) + 1;
                    if(seconds > 60) {
                        el_minute.text(_.str.sprintf("%02d", parseInt(el_minute.text()) + 1));
                        seconds = 0;
                    }
                    el_second.text(_.str.sprintf("%02d", seconds));
                });
            }, 1000);
        },

现在,考虑 el_hourel_minuteel_seconds 如何计算 HH:MM 中的初始时间和当前计时器值之间的时间差:SS 方式。

提前感谢您的帮助

【问题讨论】:

  • 一种简单的方法是使用 ISO 字符串,它可以工作长达 24 小时。 333 秒:new Date(333 * 1000).toISOString().split("T").pop().split(".")[0];看起来像“00:05:33”
  • (date2.valueOf() - date1.valueOf()) / 1000 == 秒数差...
  • 为什么不在 init 上创建一个开始日期对象,在间隔计时器中创建一个新对象
  • @beauXjames——如果使用日期对象,(date2 - date1)/1000 就可以了。 ;-)
  • @RobG -- 是的,但如果他正在查看 devtools 中的变量,他可以看到 ms 并跳过呈现的日期格式 -- 将其保留为评论以避免批评 -- ;P跨度>

标签: javascript date datetime timer date-difference


【解决方案1】:

要将 H:M:S 转换为秒,您可以使用如下简单函数:

// Convert H:M:S to seconds
// Seconds are optional (i.e. n:n is treated as h:s)
function hmsToSeconds(s) {
  var b = s.split(':');
  return b[0]*3600 + b[1]*60 + (+b[2] || 0);
}

然后将秒转换回 HMS:

// Convert seconds to hh:mm:ss
// Allow for -ve time values
function secondsToHMS(secs) {
  function z(n){return (n<10?'0':'') + n;}
  var sign = secs < 0? '-':'';
  secs = Math.abs(secs);
  return sign + z(secs/3600 |0) + ':' + z((secs%3600) / 60 |0) + ':' + z(secs%60);
}

var a = '01:43:28';
var b = '12:22:46';

console.log(secondsToHMS(hmsToSeconds(a) - hmsToSeconds(b)));  // -10:39:18
console.log(secondsToHMS(hmsToSeconds(b) - hmsToSeconds(a)));  //  10:39:18

您可能想缩写函数名称:

toHMS(toSec(a) - toSec(b));  // -10:39:18

请注意,这不包括时间可能跨越夏令时边界的位置。为此,您需要包含年、月和日的完全限定日期。使用这些值创建日期对象、找出差异、转换为秒并使用 secondsToHMS 函数。

编辑

问题标题提到了日期,但内容似乎只提到了小时、分钟和秒的字符串。

如果您有 Date 对象,您可以使用以下方法以毫秒为单位获取它们之间的差异:

var diffMilliseconds = date0 - date1;

并转换为秒:

var diffSeconds = diffMilliseconds / 1000;

并使用上面的 secondsToHMS 函数显示为 HH:MM:SS:

secondsToHMS((date0 - date1) / 1000);

例如

var d0 = new Date(2014,10,10,1,43,28);
var d1 = new Date(2014,10,10,12,22,46);

console.log( secondsToHMS((d0 - d1) / 1000));  // -10:39:18

【讨论】:

    【解决方案2】:

    我认为有一个更简单的解决方案。

    function dateDiffToString(a, b){
    
        // make checks to make sure a and b are not null
        // and that they are date | integers types
    
        diff = Math.abs(a - b);
    
        ms = diff % 1000;
        diff = (diff - ms) / 1000
        ss = diff % 60;
        diff = (diff - ss) / 60
        mm = diff % 60;
        diff = (diff - mm) / 60
        hh = diff % 24;
        days = (diff - hh) / 24
    
        return days + ":" + hh+":"+mm+":"+ss+"."+ms;
    
    }
    
    var today = new Date()
    var yest = new Date()
        yest = yest.setDate(today.getDate()-1)
    
    console.log(dateDiffToString(yest, today))

    【讨论】:

    • 这是一个完美的解决方案,前提是两个 dateTime 对象应该使用相同的时区。
    【解决方案3】:
    const dateDiffToString = (a, b) => {
      let diff = Math.abs(a - b);
    
      let ms = diff % 1000;
      diff = (diff - ms) / 1000;
      let s = diff % 60;
      diff = (diff - s) / 60;
      let m = diff % 60;
      diff = (diff - m) / 60;
      let h = diff;
    
      let ss = s <= 9 && s >= 0 ? `0${s}` : s;
      let mm = m <= 9 && m >= 0 ? `0${m}` : m;
      let hh = h <= 9 && h >= 0 ? `0${h}` : h;
    
      return hh + ':' + mm + ':' + ss;
    };
    

    【讨论】:

      【解决方案4】:

      这可能是简单的答案

      var d1 = new Date(2014,10,11,1,43,28);
      var d2 = new Date(2014,10,11,2,53,58);
      var date = new Date(d2-d1);
      var hour = date.getUTCHours();
      var min = date.getUTCMinutes();
      var sec = date.getUTCSeconds();
      var day = date.getUTCDate() - 1;
      console.log(day + ":" + hour + ":" + min + ":" + sec)

      【讨论】:

        【解决方案5】:

        更直观,更易于阅读。

        function hmsToSeconds(t) {
            const [hours, minutes, seconds] = t.split(':')
            return Number(hours) * 60 * 60 + Number(minutes) * 60 + Number(seconds)
          }
        
        function secondsToHMS(secs) {
            return new Date(secs * 1000).toISOString().substr(11, 8)
          }
        
        var startTime = '01:43:28';
        var endTime = '12:22:46';
        
        console.log(secondsToHMS(hmsToSeconds(endTime) - hmsToSeconds(startTime))); //10:39:18

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-02-01
          • 1970-01-01
          • 2021-11-25
          • 2011-08-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-14
          相关资源
          最近更新 更多