Отримайте різницю годин між двома датами в Момент Js


385

Я можу отримати різницю між двома датами за допомогою MomentJs наступним чином:

moment(end.diff(startTime)).format("m[m] s[s]")

Однак я також хочу відобразити годину, коли це застосовується (лише тоді, коли минуло> = 60 хвилин).

Однак, коли я намагаюся отримати тривалість годин, використовуючи наступне:

var duration = moment.duration(end.diff(startTime));
var hours = duration.hours();

вона повертає поточну годину, а не кількість годин між двома датами.

Як я можу отримати різницю в годинах між двома Моментами?

Відповіді:


611

Ви були поруч. Вам просто потрібно використовувати duration.asHours()метод (див . Документи ).

var duration = moment.duration(end.diff(startTime));
var hours = duration.asHours();

8
Чи не повинно бути startTime.diff(end, 'hours', true);? Тривалість.asHours (); повернув би 1, якби це було 25 годин тому.
Даніель Ф

29
@DanielF Якщо ви використовуєте MomentJS> = версія 2.0.0, ви можете використовувати .diff()так. Окрім того, було б end.diff(startTime, 'hours', true)отримати кількість годин як позитивну кількість. Однак ваш другий пункт невірний. duration.hours()повернеться 1, якби це було 25 годин тому, але duration.asHours()повернеться 25.
GregL

5
@GregL Я виправлений jsfiddle.net/qxxr1Lyr Я, мабуть, помилково застосував .hours()метод, не помічаючи.
Даніель Ф

5
Як це має стільки голосів, коли все, що він робить, - це повідомити ОП про помилку, яку більшість ІДЕ відкриє тобі в будь-якому випадку ( imgur.com/a/ikyayIL ). ТАК представник спочатку найкраще одягається, тоді як інші працюють на сміття. Ой ви зафіксували помилку. Ось
4,7 кп

3
@zanderwar Я розумію ваше розчарування, але це питання 5 років. Сьогодні такі питання та відповіді не летять.
Жан-Франсуа Фабре

218

Наступний блок коду показує, як обчислити різницю в кількості днів між двома датами за допомогою MomentJS.

var now = moment(new Date()); //todays date
var end = moment("2015-12-1"); // another date
var duration = moment.duration(now.diff(end));
var days = duration.asDays();
console.log(days)

61
Принаймні його блок коду показав усі змінні, які використовувались на відміну від прийнятої відповіді чи запитання. Якщо хтось хоче відмовитися від голосу, він повинен відмовитись від питання, оскільки це неповний блок коду для початку. Чи потрібен пояснювальний код цього блоку?
Йордан Папалео

23
Ця відповідь для мене достатньо зрозуміла і навіть більш повна, ніж прийнята відповідь, де ви не знаєте, звідки беруться "кінець" і "startTime" ... Дякую за вашу відповідь, Радж!
П’єр

3
Зараз трохи простіше обійтись var now = moment();. Дивіться momentjs.com/docs/#/parsing/now
rob3c

161

Або ви можете просто:

var a = moment('2016-06-06T21:03:55');//now
var b = moment('2016-05-06T20:03:55');

console.log(a.diff(b, 'minutes')) // 44700
console.log(a.diff(b, 'hours')) // 745
console.log(a.diff(b, 'days')) // 31
console.log(a.diff(b, 'weeks')) // 4

документи: тут


11
Як я можу показати всі години, хвилини та секунди разом? Як HH: MM: SS?
Faizan Saiyed

16

Все, що вам потрібно зробити, це передати в hoursякості другого параметра функцію diff моменти.

var a = moment([21,30,00], "HH:mm:ss")
var b = moment([09,30,00], "HH:mm:ss")
a.diff(b, 'hours') // 12

Документи: https://momentjs.com/docs/#/displaying/difference/

Приклад:

const dateFormat = "YYYY-MM-DD HH:mm:ss";
// Get your start and end date/times
const rightNow = moment().format(dateFormat);
const thisTimeYesterday = moment().subtract(1, 'days').format(dateFormat);
// pass in hours as the second parameter to the diff function
const differenceInHours = moment(rightNow).diff(thisTimeYesterday, 'hours');

console.log(`${differenceInHours} hours have passed since this time yesterday`);
<script 
  src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment.min.js">
</script>


12

Існує чудовий momentметод, який називається, fromNow()що поверне час із визначеного часу в приємному для людини читаному вигляді, як це:

moment('2019-04-30T07:30:53.000Z').fromNow() // an hour ago || a day ago || 10 days ago

Або якщо ви хочете, щоб це було між двома конкретними датами, ви можете використовувати:

var a = moment([2007, 0, 28]);
var b = moment([2007, 0, 29]);
a.from(b); // "a day ago"

Взято з Документів:


7

Я знаю, що це давнє, але ось одне лінійне рішення:

const hourDiff = start.diff(end, "hours");

Де початок і кінець це моменти.

Насолоджуйтесь!


... вже запропонований Себастьяном Ларою у 2016 році
YakovL

2
 var start=moment(1541243900000);
 var end=moment(1541243942882);
 var duration = moment.duration(end.diff(startTime));
 var hours = duration.asHours();

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


1
Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, як і чому він вирішує проблему, покращить довгострокове значення відповіді.
Олександр

1
var __startTime = moment("2016-06-06T09:00").format();
var __endTime = moment("2016-06-06T21:00").format();

var __duration = moment.duration(moment(__endTime).diff(__startTime));
var __hours = __duration.asHours();
console.log(__hours);

2
Видаліть усі непотрібні перетворення з / в рядкові зображення моментів, і ви отримаєте відповідь.
Володимир М

1
Чому зайві підкреслення на початку змінних імен?
zenw0lf

1

У моєму випадку я хотів годин і хвилин:

var duration = moment.duration(end.diff(startTime));
var hours = duration.hours(); //hours instead of asHours
var minutes = duration.minutes(); //minutes instead of asMinutes

Для отримання додаткової інформації зверніться до офіційних документів .


0

Якщо ви хочете, щоб загальні хвилини між двома датами в день були розумнішими, ніж нижче, код допоможе вам заповнити Дата початку: 2018-05-04 02:08:05 , Дата закінчення: 2018-05-14 09:04:07 ...

function countDaysAndTimes(startDate,endDate){
return new Promise(function (resolve, reject) {
var dayObj = new Object;
var finalArray = new Array;

var datetime1 = moment(startDate);
var datetime2 = moment(endDate);
if(datetime1.format('D') != datetime2.format('D') || datetime1.format('M') != datetime2.format('M') ||  datetime1.format('YYYY') != datetime2.format('YYYY')){
  var onlyDate1 = startDate.split(" ");
  var onlyDate2 = endDate.split(" ");
  var totalDays = moment(onlyDate2[0]).diff(moment(onlyDate1[0]), 'days')

  // First Day Entry
  dayObj.startDate = startDate;
  dayObj.endDate = moment(onlyDate1[0]).add(1, 'day').format('YYYY-MM-DD')+" 00:00:00";
  dayObj.minutes = moment(dayObj.endDate).diff(moment(dayObj.startDate), 'minutes');
  finalArray.push(dayObj);

  // Between Days Entry
  var i = 1;
  if(totalDays > 1){
    for(i=1; i<totalDays; i++){
      var dayObj1 = new Object;
      dayObj1.startDate = moment(onlyDate1[0]).add(i, 'day').format('YYYY-MM-DD')+" 00:00:00";
      dayObj1.endDate = moment(onlyDate1[0]).add(i+1, 'day').format('YYYY-MM-DD')+" 00:00:00";
      dayObj1.minutes = moment(dayObj1.endDate).diff(moment(dayObj1.startDate), 'minutes');
      finalArray.push(dayObj1);
    }
  }

  // Last Day Entry
  var dayObj2 = new Object;
  dayObj2.startDate = moment(onlyDate1[0]).add(i, 'day').format('YYYY-MM-DD')+" 00:00:00";
  dayObj2.endDate = endDate ;
  dayObj2.minutes = moment(dayObj2.endDate).diff(moment(dayObj2.startDate), 'minutes');
  finalArray.push(dayObj2);

}
else{
  dayObj.startDate = startDate;
  dayObj.endDate = endDate;
  dayObj.minutes = datetime2.diff(datetime1, 'minutes');
  finalArray.push(dayObj);
}
console.log(JSON.stringify(finalArray));
// console.table(finalArray);
resolve(finalArray);
});
}

Вихідні дані

 [
  {
  "startDate":"2018-05-04 02:08:05",
  "endDate":"2018-05-05 00:00:00",
  "minutes":1311
  },
  {
  "startDate":"2018-05-05 00:00:00",
  "endDate":"2018-05-06 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-06 00:00:00",
  "endDate":"2018-05-07 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-07 00:00:00",
  "endDate":"2018-05-08 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-08 00:00:00",
  "endDate":"2018-05-09 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-09 00:00:00",
  "endDate":"2018-05-10 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-10 00:00:00",
  "endDate":"2018-05-11 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-11 00:00:00",
  "endDate":"2018-05-12 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-12 00:00:00",
  "endDate":"2018-05-13 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-13 00:00:00",
  "endDate":"2018-05-14 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-14 00:00:00",
  "endDate":"2018-05-14 09:04:07",
  "minutes":544
  }
 ]

0

Я знаю, що на це вже відповіли, але у випадку, якщо ви хочете чогось рекурсивного і більш загального і не покладаєтесь на момент, fromNowви можете використовувати цю функцію, яку я створив. Звичайно, ви можете змінити його логіку, щоб пристосувати її до ваших потреб, а також підтримувати роки та секунди.

var createdAt = moment('2019-05-13T14:23:00.607Z');
var expiresAt = moment('2019-05-14T14:23:00.563Z');

// You can also add years in the beginning of the array or seconds in its end
const UNITS = ["months", "weeks", "days", "hours", "minutes"]
function getValidFor (createdAt, expiresAt, unit = 'months') {
    const validForUnit = expiresAt.diff(createdAt, unit);
    // you could adjust the if to your needs 
    if (validForUnit > 1 || unit === "minutes") {
    return [validForUnit, unit];
  }
  return getValidFor(createdAt, expiresAt, UNITS[UNITS.indexOf(unit) + 1]);
}

-9
            var timecompare = {
            tstr: "",
            get: function (current_time, startTime, endTime) {
                this.tstr = "";
                var s = current_time.split(":"), t1 = tm1.split(":"), t2 = tm2.split(":"), t1s = Number(t1[0]), t1d = Number(t1[1]), t2s = Number(t2[0]), t2d = Number(t2[1]);

                if (t1s < t2s) {
                    this.t(t1s, t2s);
                }

                if (t1s > t2s) {
                    this.t(t1s, 23);
                    this.t(0, t2s);
                }

                var saat_dk = Number(s[1]);

                if (s[0] == tm1.substring(0, 2) && saat_dk >= t1d)
                    return true;
                if (s[0] == tm2.substring(0, 2) && saat_dk <= t2d)
                    return true;
                if (this.tstr.indexOf(s[0]) != 1 && this.tstr.indexOf(s[0]) != -1 && !(this.tstr.indexOf(s[0]) == this.tstr.length - 2))
                    return true;

                return false;

            },
            t: function (ii, brk) {
                for (var i = 0; i <= 23; i++) {
                    if (i < ii)
                        continue;
                    var s = (i < 10) ? "0" + i : i + "";
                    this.tstr += "," + s;
                    if (brk == i)
                        break;
                }
            }};

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