Erhalten Sie Stundenunterschied zwischen zwei Daten in Moment Js

385

Ich kann den Unterschied zwischen zwei Daten mithilfe von MomentJs wie folgt ermitteln:

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

Ich möchte jedoch gegebenenfalls auch die Stunde anzeigen (nur wenn> = 60 Minuten vergangen sind).

Wenn ich jedoch versuche, die Dauer Stunden wie folgt abzurufen:

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

Es wird die aktuelle Stunde und nicht die Anzahl der Stunden zwischen den beiden Daten zurückgegeben.

Wie erhalte ich den Stundenunterschied zwischen zwei Momenten?

Dani
quelle

Antworten:

611

Du warst nah. Sie müssen nur die duration.asHours()Methode verwenden (siehe die Dokumente ).

var duration = moment.duration(end.diff(startTime));
var hours = duration.asHours();
GregL
quelle
8
Sollte es nicht sein startTime.diff(end, 'hours', true);? Die Dauer.asHours (); würde 1 zurückgeben, wenn es vor 25 Stunden wäre.
Daniel F
29
@DanielF Wenn Sie MomentJS> = Version 2.0.0 verwenden, können Sie .diff()ja verwenden. Außer es wäre end.diff(startTime, 'hours', true), die Anzahl der Stunden als positive Zahl zu erhalten. Ihr zweiter Punkt ist jedoch nicht korrekt. duration.hours()würde 1 zurückgeben, wenn es vor 25 Stunden duration.asHours()wäre , würde aber 25 zurückgeben.
GregL
5
@ GregL Ich stehe korrigiert jsfiddle.net/qxxr1Lyr Ich muss die .hours()Methode fälschlicherweise verwendet haben , ohne es zu merken.
Daniel F
5
Wie hat dies so viele Stimmen, wenn es das OP nur auf einen Tippfehler aufmerksam macht, den die meisten IDEs Ihnen sowieso offenbaren würden ( imgur.com/a/ikyayIL ). SO rep ist zuerst am besten angezogen, während andere für Schrott arbeiten. Oh, du hast einen Tippfehler behoben. Hier ist 4.7k rep
zanderwar
3
@ Zanderwar Ich verstehe Ihre Frustration, aber dies ist eine 5 Jahre alte Frage. Heute würden solche Fragen und Antworten nicht fliegen.
Jean-François Fabre
218

Der folgende Codeblock zeigt, wie die Differenz in der Anzahl der Tage zwischen zwei Daten mit MomentJS berechnet wird.

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
quelle
61
Zumindest sein Codeblock zeigte alle Variablen, die im Gegensatz zur akzeptierten Antwort oder der Frage verwendet wurden. Wenn jemand abstimmen möchte, sollte er die Frage ablehnen, da es sich um einen unvollständigen Codeblock handelt. Muss dieser Codeblock wirklich erklärt werden?
Jordan Papaleo
23
Diese Antwort ist klar genug und für mich noch vollständiger als die oben akzeptierte Antwort, bei der Sie nicht wissen, woher 'end' und 'startTime' kommen ... Vielen Dank für Ihre Antwort Raj!
Pierre
3
Es ist etwas einfacher, jetzt durchzukommen var now = moment();. Siehe momentjs.com/docs/#/parsing/now
rob3c
161

Oder Sie können einfach tun:

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

docs: hier

Sebastián Lara
quelle
12
Wie kann ich alle Stunden, Minuten und Sekunden zusammen anzeigen? Wie HH: MM: SS?
Faizan Saiyed
16

Alles, was Sie tun müssen, ist, hoursals zweiten Parameter die Funktion "Momente diff" zu übergeben.

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

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

Beispiel:

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
quelle
12

Es gibt eine großartige momentMethode fromNow(), die die Zeit einer bestimmten Zeit in einer für Menschen lesbaren Form zurückgibt:

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

Oder wenn Sie das zwischen zwei bestimmten Daten möchten, können Sie verwenden:

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

Aus den Dokumenten entnommen:

Dryden Williams
quelle
7

Ich weiß, dass dies alt ist, aber hier ist eine Einzeiler-Lösung:

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

Wo Anfang und Ende Momentobjekte sind.

Genießen!

Francois Nadeau
quelle
... bereits von Sebastián Lara im Jahr 2016 vorgeschlagen
YakovL
2
 var start=moment(1541243900000);
 var end=moment(1541243942882);
 var duration = moment.duration(end.diff(startTime));
 var hours = duration.asHours();

Wie Sie sehen können, mussten Start- und Enddatum Momentobjekte sein, damit diese Methode funktioniert.

Richang Sharma
quelle
2
Während dieser Code die Frage möglicherweise beantwortet, würde die Bereitstellung eines zusätzlichen Kontexts darüber, wie und warum das Problem gelöst wird, den langfristigen Wert der Antwort verbessern.
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
quelle
2
Entfernen Sie alle nicht benötigten Konvertierungen von / zu Zeichenfolgendarstellungen von Momenten, und Sie erhalten die akzeptierte Antwort.
Vladimir M
1
Warum die zusätzlichen Unterstriche am Anfang von Variablennamen?
Zenw0lf
1

In meinem Fall wollte ich Stunden und Minuten:

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

Weitere Informationen finden Sie in den offiziellen Dokumenten .

Anil Singh
quelle
0

Wenn Sie eine Gesamtminute zwischen zwei Daten pro Tag wünschen , hilft Ihnen der folgende Code möglicherweise vollständig. Startdatum: 2018-05-04 02:08:05 , Enddatum: 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);
});
}

Ausgabe

 [
  {
  "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
quelle
0

Ich weiß, dass dies bereits beantwortet wurde, aber falls Sie etwas Rekursives und Allgemeineres wünschen und sich nicht auf den Moment verlassen möchten, können fromNowSie diese von mir erstellte Funktion verwenden. Natürlich können Sie die Logik ändern, um sie an Ihre Bedürfnisse anzupassen und auch Jahre und Sekunden zu unterstützen.

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
quelle
-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
quelle
8
Könnten Sie eine Erklärung hinzufügen, anstatt nur den Code zu veröffentlichen?
Paul Floyd