Отримайте різницю у часі між двома датами


246

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


2
"але я впевнений, що мені не подобаються дати": P Ви коли-небудь читали це: nodatime.org/unstable/userguide/trivia.html ?
Борис Калленс

Відповіді:


367

Цей підхід працюватиме ТІЛЬКИ, коли загальна тривалість менше 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"

31
@TML - Я чітко сказав, що він не працюватиме протягом 24 годин і довше.
Метт Джонсон-Пінт

1
Це спрацювало чудово. momentjs - це така вишукана бібліотека, що мене дивує, що у неї немає більш простого способу, але, можливо, те, що я роблю, не таке "нормальне". Напевно, у мене не було б більше 24 годин, але приємно мати варіант, якщо це станеться. Спасибі за вашу допомогу.
Лев

69

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

Це не дає тобі потрібного формату, але

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

дасть вам корисний формат на кшталт "40 хвилин". Якщо ви дійсно зацікавлені в цьому конкретному форматуванні, вам доведеться самостійно створити новий рядок. Дешевий спосіб був би

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

де var diff = moment.duration(now.diff(then)). Це не дає вам нульової прокладки для однозначних значень. Для цього ви можете розглянути щось на зразок underscore.string - хоча це здається довгим шляхом лише за кілька зайвих нулів. :)


4
вам доведеться використовувати asHoursзамість них hoursі відтягувати десятки. Інакше це матиме ту саму проблему, яку ви зловили в моїй відповіді. :)
Метт Джонсон-Пінт

humanize () приємно торкається, але я в кінцевому підсумку використав Метт пропозицію. Дякую за пораду.
Лев

Дякуємо, що вказали на це, @MattJohnson - я навіть не зрозумів.
TML

2
Зауважте, було б розумно використовувати: [Math.floor(diff.asHours()), diff.minutes(), diff.seconds()].join(':')щоб отримати бажаний результат. без
десятків

63
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/


3
це працює лише на дати. ОП хотіла мати різницю в часі
apfz

Це найпростіше рішення, яке працює. Так, і з часовими позначками.
Фахім

30

Якщо ви хочете різниці двох часових позначок у загальних днях, годинах і хвилинах, а не в місяцях і роках.

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 хвилин.


19

Під час дзвінка diffmoment.js обчислює різницю в мілісекундах. Якщо передані мілісекунди duration, вони використовуються для обчислення правильності тривалості. Однак. коли ви передаєте ті самі мілісекунди до moment(), він обчислює дату, яка є мілісекундами з часу (після) епохи / унікса, що є 1 січня 1970 року (опівночі UTC / GMT). Ось чому ви отримуєте 1969 рік як рік разом із неправильною годиною.

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

Отже, я думаю, що саме так слід робити, оскільки moment.js не пропонує formatфункцію протягом тривалості. Або ви можете написати просту обгортку, щоб зробити її легшою / красивішою.


11

Це має добре працювати.

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

Краще рішення! :)
JHenry

Найкраще рішення коли-небудь
Олександр Ісус Гена

9

Якщо ми хочемо лише hh: mm: ss, ми можемо використовувати таку функцію:

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

4
Я ніде не бачу, щоб ви в цьому відповіли.
Джоель


3

Замість

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

Краще робити

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

2

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

2

Машинопис: слід працювати наступним чином,

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

0

Я створюю просту функцію з typecript

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

InTime = 06: 38, вихідний час = 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

ДАТИВАННЯ НА ВРЕМУ НА ТОЧКІ

    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

РІЗНОМИЧНІ РОЗМІРИ ВІД ВИКОРИСТАННЯ 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.