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

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

22 ответа

Решение

Этот подход будет работать ТОЛЬКО тогда, когда общая продолжительность будет менее 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() отдельно, но вы также должны были бы Zeropad их.

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

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"

Ваша проблема заключается в передаче результата 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)), Это не дает вам заполнение нулями однозначных значений. Для этого вы, возможно, захотите рассмотреть что-то вроде http://epeli.github.io/underscore.string/ - хотя кажется, что нужно пройти еще несколько лишних нулей.:)

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

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

See more in http://momentjs.com/docs/

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

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 минут.

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

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

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

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

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

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

//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;
}

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

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

    var aa = duration.asHours();

Вместо

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

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

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

Это будет работать для любой даты в формате ГГГГ-ММ-ДД ЧЧ: мм: сс.

const moment=require("moment");
let startDate=moment("2020-09-16 08:39:27");
const endDate=moment();


const duration=moment.duration(endDate.diff(startDate))
console.log(duration.asSeconds());
 console.log(duration.asHours());

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

Машинопись: следующее должно работать,

export const getTimeBetweenDates = ({
  until,
  format
}: {
  until: number;
  format: 'seconds' | 'minutes' | 'hours' | 'days';
}): number => {
  const date = new Date();
  const remainingTime = new Date(until * 1000);
  const getFrom = moment([date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()]);
  const getUntil = moment([remainingTime.getUTCFullYear(), remainingTime.getUTCMonth(), remainingTime.getUTCDate()]);
  const diff = getUntil.diff(getFrom, format);
  return !isNaN(diff) ? diff : null;
};

Это вернет самую большую разницу за период времени, например (4 секунды, 2 минуты, 1 час, 2 дня, 3 недели, 4 месяца, 5 лет). Я использую это для уведомления о недавнем времени.

      function dateDiff(startDate, endDate) {
    let arrDate = ["seconds", "minutes", "hours", "days", "weeks", "months", "years"];
    let dateMap = arrDate.map(e => moment(endDate).diff(startDate, e));
    let index = 6 - dateMap.filter(e => e == 0).length;
    return {
        type: arrDate[index] ?? "seconds",
        value: dateMap[index] ?? 0
    };
}


Пример:

      dateDiff("2021-06-09 01:00:00", "2021-06-09 04:01:01")

{type: "hours", value: 3}

      dateDiff("2021-06-09 01:00:00", "2021-06-12 04:01:01")

{type: "days", value: 3}

      dateDiff("2021-06-09 01:00:00", "2021-06-09 01:00:10")

{type: "seconds", value: 10}

Следующий подход действителен для всех случаев (разница между датами менее 24 часов и разница более 24 часов):

// Defining start and end variables
let start = moment('04/09/2013 15:00:00', 'DD/MM/YYYY hh:mm:ss');
let end   = moment('04/09/2013 14:20:30', 'DD/MM/YYYY hh:mm:ss');

// Getting the difference: hours (h), minutes (m) and seconds (s)
let h  = end.diff(start, 'hours');
let m  = end.diff(start, 'minutes') - (60 * h);
let s  = end.diff(start, 'seconds') - (60 * 60 * h) - (60 * m);

// Formating in hh:mm:ss (appends a left zero when num < 10)
let hh = ('0' + h).slice(-2);
let mm = ('0' + m).slice(-2);
let ss = ('0' + s).slice(-2);

console.log(`${hh}:${mm}:${ss}`); // 00:39:30

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

    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
}
      const getRemainingTime = (t2) => {
  const t1 = new Date().getTime();
  let ts = (t1-t2.getTime()) / 1000;

  var d = Math.floor(ts / (3600*24));
  var h = Math.floor(ts % (3600*24) / 3600);
  var m = Math.floor(ts % 3600 / 60);
  var s = Math.floor(ts % 60);

  console.log(d, h, m, s)

}

Если вы хотите локализованное количество дней между двумя датами (startDate, endDate):

var currentLocaleData = moment.localeData("en");
var duration = moment.duration(endDate.diff(startDate));
var nbDays = Math.floor(duration.asDays()); // complete days
var nbDaysStr = currentLocaleData.relativeTime(returnVal.days, false, "dd", false);

nbDaysStr будет содержать что-то вроде "3 дня";

См. https://momentjs.com/docs/ для получения информации о том, как, например, отображать количество часов или месяцев.

Чтобы получить разницу между датами в формате двух моментов или безразличием формата даты javascript в минутах, наиболее оптимальным решением является

const timeDiff = moment.duration((moment(apptDetails.end_date_time).diff(moment(apptDetails.date_time)))).asMinutes()

вы можете изменить формат разницы по своему усмотрению, просто заменив функцию asMinutes()

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

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

ЭПОХА РАЗНИЦА ВРЕМЕНИ ИСПОЛЬЗОВАНИЯ MOMENTJS:

Чтобы узнать разницу между двумя эпохами:

Синтаксис:moment.duration(moment(moment(date1).diff(moment(date2)))).asHours()

Разница в часах:moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asHours()

Разница в минутах:moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asMinutes().toFixed()

Примечание: вы можете удалить.toFixed() если вам нужны точные значения.

Код:

const moment = require('moment')

console.log('Date 1',moment(1590597909877).toISOString())
console.log('Date 2',moment(1590597744551).toISOString())
console.log('Date1 - Date 2 time diffrence is : ',moment.duration(moment(moment(1590597909877).diff(moment(1590597744551)))).asMinutes().toFixed()+' minutes')

См. Рабочий пример здесь:https://repl.it/repls/MoccasinDearDimension

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

Это очень просто с моментом ниже, код вернет разницу в часах от текущего времени:

      moment().diff('2021-02-17T14:03:55.811000Z', "h")
Другие вопросы по тегам