рассчитать разницу во времени между двумя датами в ЧЧ: ММ: СС javascript

Я создал одно приложение таймера в 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_hour, el_minute, el_seconds, как я могу подсчитать разницу во времени между временем инициализации и текущим значением таймера в формате ЧЧ:ММ:СС .

заранее спасибо за помощь


person BomberMan    schedule 27.10.2014    source источник
comment
один простой способ — использовать строки ISO, которые работают до 24 часов. на 333 секунды: новая дата( 333 * 1000 ).toISOString().split(T).pop().split(.)[0]; который выглядит как 00:05:33   -  person dandavis    schedule 27.10.2014
comment
(date2.valueOf() - date1.valueOf()) / 1000 == разница в количестве секунд...   -  person beauXjames    schedule 27.10.2014
comment
почему бы вам просто не создать объект даты начала при инициализации и новый в интервальном таймере   -  person charlietfl    schedule 27.10.2014
comment
@beauXjames — при использовании объектов даты подойдет (date2 - date1)/1000. ;-)   -  person RobG    schedule 27.10.2014
comment
@RobG - правда, но если он просматривает переменные в devtools, он может видеть мс и пропускать отображаемый формат даты - сохранил его как комментарий, чтобы избежать критики - ; P   -  person beauXjames    schedule 27.10.2014


Ответы (3)


Чтобы преобразовать 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 выше:

secondsToHMS((date0 - date1) / 1000);

e.g.

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
person RobG    schedule 27.10.2014

Я думаю, что есть более простое решение.

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

person sh87    schedule 15.05.2018
comment
Это идеальное решение, если оба объекта dateTime должны использовать один и тот же часовой пояс. - person BuzzR; 03.02.2020

Это может быть простой ответ

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)

person GAURAV    schedule 30.11.2018