it-swarm.com.ru

Получите разницу во времени между двумя датами

Я знаю, что могу сделать что-нибудь и еще несколько вовлекающих дат с моментами. Но смущающе, я с трудом пытаюсь сделать что-то, что кажется простым: получить разницу между 2 разами.

Пример:

var now  = "04/09/2013 15:00:00";
var then = "04/09/2013 14:20:30";

//expected result:
"00:39:30"

что я пробовал:

var now = moment("04/09/2013 15:00:00");
var then = moment("04/09/2013 14:20:30");

console.log(moment(moment.duration(now.diff(then))).format("hh:mm:ss"))
//outputs 10:39:30  

Я не понимаю, что это за "10" там. Я живу в Бразилии, поэтому мы будем UTC-0300, если это актуально.

Результатом moment.duration(now.diff(then)) является продолжительность с правильными внутренними значениями: 

 days: 0
 hours: 0
 milliseconds: 0
 minutes: 39
 months: 0
 seconds: 30
 years: 0

Итак, я предполагаю, что мой вопрос: как преобразовать длительность момента в интервал времени? Я уверен, что могу использовать

duration.get("hours") +":"+ duration.get("minutes") +:+ duration.get("seconds")

но я чувствую, что есть нечто более изящное, которое я полностью упускаю.

Обновление
Если присмотреться, в приведенном выше примере now

Tue Apr 09 2013 15:00:00 GMT-0300 (E. South America Standard Time)…}

и moment(moment.duration(now.diff(then))) это:

Wed Dec 31 1969 22:39:30 GMT-0200 (E. South America Daylight Time)…}

Я не уверен, почему второе значение в летнее время (-0200) ... но я уверен, что я не люблю даты :(

обновление 2  

ну, это значение -0200, вероятно, потому что 31.12.1969 была дата, когда использовалось летнее время ... вот и все.

206
Leo

Этот подход будет работать ТОЛЬКО, если общая продолжительность меньше 24 часов:

var now  = "04/09/2013 15:00:00";
var then = "04/09/2013 14:20:30";

moment.utc(moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"))).format("HH:mm:ss")

// outputs: "00:39:30"

Если у вас есть 24 часа или более, часы сбрасываются до нуля с помощью вышеуказанного подхода, поэтому он не идеален.

Если вы хотите получить действительный ответ в течение 24 часов или более, тогда вам придется сделать что-то вроде этого:

var now  = "04/09/2013 15:00:00";
var then = "02/09/2013 14:20:30";

var ms = moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"));
var d = moment.duration(ms);
var s = Math.floor(d.asHours()) + moment.utc(ms).format(":mm:ss");

// outputs: "48:39:30"

Обратите внимание, что я использую время UTC в качестве ярлыка. Вы можете извлечь d.minutes() и d.seconds() по отдельности, но вам также придется обнулить их.

Это необходимо, потому что возможность форматировать возражение duration в настоящее время отсутствует в moment.js. Это было запрошено здесь . Тем не менее, существует сторонний плагин под названием момент-длительности-формата , который специально для этой цели:

var now  = "04/09/2013 15:00:00";
var then = "02/09/2013 14:20:30";

var ms = moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"));
var d = moment.duration(ms);
var s = d.format("hh:mm:ss");

// outputs: "48:39:30"
305
Matt Johnson

Ваша проблема заключается в передаче результата moment.duration () обратно в moment () перед его форматированием; это приводит к тому, что moment () интерпретирует его как время относительно эпохи Unix.

Это не дает вам тот формат, который вы ищете, но

moment.duration(now.diff(then)).humanize()

даст вам полезный формат, как "40 минут". Если вы действительно заинтересованы в этом конкретном форматировании, вам придется создавать новую строку самостоятельно. Дешевый способ будет

[diff.asHours(), diff.minutes(), diff.seconds()].join(':')

где var diff = moment.duration(now.diff(then)). Это не дает вам заполнение нулями однозначных значений. Для этого, возможно, вы захотите рассмотреть что-то вроде underscore.string - хотя кажется, что это долгий путь только для нескольких дополнительных нулей. :)

56
TML
var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b, 'days') //[days, years, months, seconds, ...]
//Result 1 

Работал для меня

Подробнее в http://momentjs.com/docs/#/displaying/difference/

53
Danilo Colasso

Если вы хотите, чтобы разница между двумя временными метками составляла только общее количество дней, часов и минут, а не месяцев и лет.

var now  = "01/08/2016 15:00:00";
var then = "04/02/2016 14:20:30";
var diff = moment.duration(moment(then).diff(moment(now)));

diff содержит 2 месяца, 23 дня, 23 часа и 20 минут. Но нам нужен результат только в днях, часах и минутах, поэтому простое решение:

var days = parseInt(diff.asDays()); //84

var hours = parseInt(diff.asHours()); //2039 hours, but it gives total hours in given miliseconds which is not expacted.

hours = hours - days*24;  // 23 hours

var minutes = parseInt(diff.asMinutes()); //122360 minutes,but it gives total minutes in given miliseconds which is not expacted.

minutes = minutes - (days*24*60 + hours*60); //20 minutes.

Окончательный результат составит: 84 дня, 23 часа, 20 минут.

27
Mahima Agrawal

Когда вы вызываете diff, moment.js вычисляет разницу в миллисекундах . Если миллисекунды передаются в duration, они используются для вычисления продолжительности, которая является правильной . Однако. когда вы передаете те же миллисекунды функции moment(), она вычисляет дату, которая равна миллисекундам с (после) времени эпохи/юникса, которое является 1 января 1970 года (полночь UTC/GMT) . Именно поэтому вы получаете 1969 год как год вместе с неправильным часом.

duration.get("hours") +":"+ duration.get("minutes") +":"+ duration.get("seconds")

Итак, я думаю, что это то, как вы должны это сделать, так как moment.js не предлагает функцию format для продолжительности. Или вы можете написать простую обертку, чтобы сделать ее проще/красивее.

18
Joon

Если мы хотим только чч: мм: сс, мы можем использовать такую ​​функцию:

//param: duration in milliseconds
MillisecondsToTime: function(duration) {
    var seconds = parseInt((duration/1000)%60)
        , minutes = parseInt((duration/(1000*60))%60)
        , hours = parseInt((duration/(1000*60*60))%24)
        , days  = parseInt(duration/(1000*60*60*24));

    var hoursDays = parseInt(days*24);
    hours += hoursDays;
    hours = (hours < 10) ? "0" + hours : hours;
    minutes = (minutes < 10) ? "0" + minutes : minutes;
    seconds = (seconds < 10) ? "0" + seconds : seconds;
    return hours + ":" + minutes + ":" + seconds;
}
9
Filipe Eusébio

Это должно работать нормально. 

var now  = "04/09/2013 15:00:00";
var then = "02/09/2013 14:20:30";

var ms = moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"));
var d = moment.duration(ms);

console.log(d.days(), d.hours(), d.minutes(), d.seconds());
6
Manzurul

Вместо 

Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss")

Лучше сделать

moment.utc(total.asMilliseconds()).format("HH:mm:ss");
3
robinvdvleuten

Использовать этот,

  var duration = moment.duration(endDate.diff(startDate));

    var aa = duration.asHours();
1
Abdus Salam Azad

ДАТА ВРЕМЯ НА ОСНОВЕ ВХОДА  

    var dt1 = new Date("2019-1-8 11:19:16");
    var dt2 = new Date("2019-1-8 11:24:16");


    var diff =(dt2.getTime() - dt1.getTime()) ;
    var hours = Math.floor(diff / (1000 * 60 * 60));
    diff -= hours * (1000 * 60 * 60);
    var mins = Math.floor(diff / (1000 * 60));
    diff -= mins * (1000 * 60);


    var response = {
        status : 200,
        Hour : hours,
        Mins : mins
    }

РЕЗУЛЬТАТ

{
"status": 200,
"Hour": 0,
"Mins": 5
}
0
Anandan K

Я создаю простую функцию с TypeScript

const diffDuration: moment.Duration = moment.duration(moment('2017-09-04 12:55').diff(moment('2017-09-02 13:26')));
setDiffTimeString(diffDuration);

function setDiffTimeString(diffDuration: moment.Duration) {
  const str = [];
  diffDuration.years() > 0 ? str.Push(`${diffDuration.years()} year(s)`) : null;
  diffDuration.months() > 0 ? str.Push(`${diffDuration.months()} month(s)`) : null;
  diffDuration.days() > 0 ? str.Push(`${diffDuration.days()} day(s)`) : null;
  diffDuration.hours() > 0 ? str.Push(`${diffDuration.hours()} hour(s)`) : null;
  diffDuration.minutes() > 0 ? str.Push(`${diffDuration.minutes()} minute(s)`) : null;
  console.log(str.join(', '));
} 
// output: 1 day(s), 23 hour(s), 29 minute(s)

для генерации JavaScript https://www.typescriptlang.org/play/index.html

0
Serkan KONAKCI

В ES8 используют момент, сейчас и начинают быть моментные объекты.

const duration = moment.duration(now.diff(start));
const timespan = duration.get("hours").toString().padStart(2, '0') +":"+ duration.get("minutes").toString().padStart(2, '0') +":"+ duration.get("seconds").toString().padStart(2, '0');
0
Fernando Rossato

InTime = 06: 38, Outtime = 15: 40

 calTimeDifference(){
        this.start = dailyattendance.InTime.split(":");
        this.end = dailyattendance.OutTime.split(":");
        var time1 = ((parseInt(this.start[0]) * 60) + parseInt(this.start[1]))
        var time2 = ((parseInt(this.end[0]) * 60) + parseInt(this.end[1]));
        var time3 = ((time2 - time1) / 60);
        var timeHr = parseInt(""+time3);
        var  timeMin = ((time2 - time1) % 60);
    }
0
Sanket Parchande