Uzyskaj różnicę godzin między dwiema datami w Moment Js

385

Jestem w stanie uzyskać różnicę między dwiema datami za pomocą MomentJs w następujący sposób:

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

Jednak chcę również wyświetlić godzinę, jeśli dotyczy (tylko, gdy minęło> = 60 minut).

Jednak gdy próbuję odzyskać godziny trwania, korzystając z następujących czynności:

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

zwraca bieżącą godzinę, a nie liczbę godzin między dwiema datami.

Jak uzyskać różnicę w godzinach między dwiema chwilami?

Dani
źródło

Odpowiedzi:

611

Byłeś blisko Musisz tylko użyć duration.asHours()metody (zobacz dokumenty ).

var duration = moment.duration(end.diff(startTime));
var hours = duration.asHours();
GregL
źródło
8
Nie powinno tak być startTime.diff(end, 'hours', true);? The duration.asHours (); zwrócił 1, gdyby to było 25 godzin temu.
Daniel F
29
@DanielF Jeśli używasz MomentJS> = wersja 2.0.0, możesz użyć .diff(), tak. Z wyjątkiem tego, że end.diff(startTime, 'hours', true)liczba godzin byłaby dodatnia. Jednak twój drugi punkt jest nieprawidłowy. duration.hours()zwrócił 1, gdyby było 25 godzin temu, ale duration.asHours()zwróciłby 25.
GregL
5
@GregL Stoję po korekcie jsfiddle.net/qxxr1Lyr Musiałem przez pomyłkę użyć tej .hours()metody bez zauważenia.
Daniel F
5
Jak to ma tyle głosów, gdy wszystko, co robi, to uświadomienie OPowi literówki, którą większość IDE i tak by ci ujawniła ( imgur.com/a/ikyayIL ). Repozytorium SO jest pierwsze w najlepiej ubranych, podczas gdy inni pracują na złom. Och, naprawiłeś literówkę ... oto 4,7 tys. Powtórzeń
zanderwar
3
@zanderwar Rozumiem twoją frustrację, ale to jest pytanie sprzed 5 lat. Dzisiaj takie pytania i odpowiedzi nie będą latać.
Jean-François Fabre
218

Poniższy blok kodu pokazuje, jak obliczyć różnicę liczby dni między dwiema datami za pomocą 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)
selftaught91
źródło
61
Przynajmniej jego blok kodu pokazywał wszystkie używane zmienne w przeciwieństwie do zaakceptowanej odpowiedzi lub pytania. Jeśli ktoś chce odmówić głosowania, powinien głosować na pytanie, ponieważ jest to niekompletny blok kodu, aby rozpocząć. Czy ten blok kodu naprawdę wymaga wyjaśnienia?
Jordan Papaleo,
23
Ta odpowiedź jest dla mnie wystarczająco jasna i jeszcze bardziej kompletna niż zaakceptowana powyżej odpowiedź, w której nie wiesz, skąd pochodzą słowa „koniec” i „czas rozpoczęcia” ... Bardzo dziękuję za odpowiedź Raj!
Pierre
3
Teraz jest trochę łatwiej var now = moment();. Zobacz momentjs.com/docs/#/parsing/now
rob3c
161

Lub możesz zrobić po prostu:

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

dokumenty: tutaj

Sebastián Lara
źródło
11
Jak mogę wyświetlić wszystkie godziny, minuty i sekundy razem? Jak HH: MM: SS?
Faizan Saiyed
16

Wszystko, co musisz zrobić, to przekazać hoursjako funkcję różnicowania drugiego parametru do momentu.

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

Dokumenty: https://momentjs.com/docs/#/displaying/difference/

Przykład:

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>

JSON C11
źródło
12

Istnieje świetna momentmetoda o nazwie fromNow(), która zwróci czas z określonego czasu w ładnej, czytelnej dla człowieka formie, na przykład:

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

Lub jeśli chcesz, aby między dwiema konkretnymi datami możesz użyć:

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

Zaczerpnięte z Dokumentów:

Dryden Williams
źródło
7

Wiem, że to stare, ale oto jedno rozwiązanie liniowe:

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

Gdzie początek i koniec są obiektami chwili.

Cieszyć się!

Francois Nadeau
źródło
... już zaproponował Sebastián Lara w 2016 r.
JakowL
2
 var start=moment(1541243900000);
 var end=moment(1541243942882);
 var duration = moment.duration(end.diff(startTime));
 var hours = duration.asHours();

Jak widać, data początkowa i końcowa musiały być obiektami momentu, aby ta metoda działała.

Richang Sharma
źródło
1
Chociaż ten kod może odpowiedzieć na pytanie, zapewnienie dodatkowego kontekstu dotyczącego tego, jak i dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi.
Alexander
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);
AKHIL
źródło
2
Usuń wszystkie niepotrzebne konwersje z / do ciągów reprezentujących chwile, a skończysz na zaakceptowanej odpowiedzi.
Vladimir M
1
Dlaczego dodatkowe podkreślenia na początku nazw zmiennych?
zenw0lf
1

W moim przypadku chciałem godzin i minut:

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

Aby uzyskać więcej informacji, zapoznaj się z oficjalnymi dokumentami .

Anil Singh
źródło
0

Jeśli chcesz mieć całkowitą liczbę minut między dwiema datami w ciągu dnia, niż może poniżej, kod pomoże Ci w pełni Data rozpoczęcia: 2018-05-04 02:08:05 , Data zakończenia: 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);
});
}

Wynik

 [
  {
  "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
  }
 ]
Renish Gotecha
źródło
0

Wiem, że już na to odpowiedziano, ale na wypadek, gdybyś chciał czegoś rekurencyjnego i bardziej ogólnego i nie polegając na momencie fromNow, mógłbyś użyć tej funkcji, którą stworzyłem. Oczywiście możesz zmienić jego logikę, aby dostosować ją do swoich potrzeb, aby obsługiwać lata i sekundy.

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]);
}
Mounir Dhahri
źródło
-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;
                }
            }};
Osman AKTAS
źródło
8
Czy mógłbyś dodać jakieś wyjaśnienie, a nie tylko kod pocztowy?
Paul Floyd,