Ich weiß, dass ich mit momentjs alles und noch mehr Termine machen kann. Aber peinlich, es fällt mir schwer, etwas zu tun, das einfach zu sein scheint: den Unterschied zwischen zwei Mal zu bekommen.
Beispiel:
var now = "04/09/2013 15:00:00";
var then = "04/09/2013 14:20:30";
//expected result:
"00:39:30"
was ich versucht habe:
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
Ich verstehe nicht, was diese "10" dort ist. Ich lebe in Brasilien, also sind wir utc-0300, wenn das relevant ist.
Das Ergebnis moment.duration(now.diff(then))
ist eine Dauer mit den richtigen internen Werten:
days: 0
hours: 0
milliseconds: 0
minutes: 39
months: 0
seconds: 30
years: 0
Ich denke also, meine Frage ist: Wie konvertiere ich die Dauer eines Moments in ein Zeitintervall? Ich kann sicher verwenden
duration.get("hours") +":"+ duration.get("minutes") +:+ duration.get("seconds")
aber ich fühle, dass es etwas eleganteres gibt , das mir völlig fehlt.
Das Update
, das genauer betrachtet wird, ist im obigen Beispiel now
:
Tue Apr 09 2013 15:00:00 GMT-0300 (E. South America Standard Time)…}
und moment(moment.duration(now.diff(then)))
ist:
Wed Dec 31 1969 22:39:30 GMT-0200 (E. South America Daylight Time)…}
Ich bin nicht sicher, warum der zweite Wert in der Sommerzeit (-0200) ist ... aber ich bin sicher, dass ich keine Daten mag :(
Update 2
Nun, der Wert ist -0200, wahrscheinlich weil der 31.12.1969 ein Datum war, an dem die Sommerzeit verwendet wurde ... also das ist es.
Antworten:
Dieser Ansatz funktioniert NUR, wenn die Gesamtdauer weniger als 24 Stunden beträgt:
Wenn Sie 24 Stunden oder mehr Zeit haben, werden die Stunden mit dem oben beschriebenen Ansatz auf Null zurückgesetzt, sodass dies nicht ideal ist.
Wenn Sie eine gültige Antwort für eine Dauer von 24 Stunden oder mehr erhalten möchten, müssen Sie stattdessen Folgendes tun:
Beachten Sie, dass ich die utc-Zeit als Verknüpfung verwende. Sie könnten herausziehen
d.minutes()
undd.seconds()
separat, aber Sie müssten sie auch auf Null setzen.Dies ist erforderlich, da die Möglichkeit zum Formatieren eines
duration
Einspruchs derzeit nicht in moment.js vorhanden ist. Es wurde hier angefordert . Es gibt jedoch ein Plugin eines Drittanbieters namens Moment-Duration-Format , das speziell für diesen Zweck entwickelt wurde:quelle
Ihr Problem besteht darin, das Ergebnis von moment.duration () vor dem Formatieren wieder in moment () zu übertragen. Dies führt dazu, dass moment () es als eine Zeit relativ zur Unix-Epoche interpretiert.
Es gibt Ihnen nicht genau das Format, das Sie suchen, aber
moment.duration(now.diff(then)).humanize()
würde Ihnen ein nützliches Format wie "40 Minuten" geben. Wenn Sie sich wirklich für diese spezielle Formatierung interessieren, müssen Sie selbst eine neue Zeichenfolge erstellen. Ein billiger Weg wäre
[diff.asHours(), diff.minutes(), diff.seconds()].join(':')
wo
var diff = moment.duration(now.diff(then))
. Dies gibt Ihnen keine Null-Auffüllung für einstellige Werte. Dafür möchten Sie vielleicht etwas wie underscore.string in Betracht ziehen - obwohl es ein langer Weg zu sein scheint, nur ein paar zusätzliche Nullen zu machen. :) :)quelle
asHours
stattdessen verwendenhours
und die Dezimalstellen abziehen. Andernfalls hätte es das gleiche Problem, das Sie in meiner Antwort festgestellt haben. :)[Math.floor(diff.asHours()), diff.minutes(), diff.seconds()].join(':')
, um das gewünschte Ergebnis zu erzielen. ohne Dezimalstelle im ersten TeilHat für mich gearbeitet
Weitere Informationen finden Sie unter http://momentjs.com/docs/#/displaying/difference/.
quelle
Wenn Sie eine Differenz von zwei Zeitstempeln in Tage, Stunden und Minuten wünschen, nicht in Monaten und Jahren.
diff enthält 2 Monate, 23 Tage, 23 Stunden und 20 Minuten. Das Ergebnis muss jedoch nur in Tagen, Stunden und Minuten angegeben werden. Die einfache Lösung lautet also:
Das Endergebnis ist: 84 Tage, 23 Stunden, 20 Minuten.
quelle
Beim Aufruf
diff
berechnet moment.js die Differenz in Millisekunden. Wenn die Millisekunden an übergeben werden,duration
wird sie verwendet, um die korrekte Dauer zu berechnen. Jedoch. Wenn Sie die gleichen Millisekunden an die übergebenmoment()
, wird das Datum berechnet, das Millisekunden von (nach) der Epoche / Unix-Zeit am 1. Januar 1970 (Mitternacht UTC / GMT) entfernt ist. Deshalb bekommen Sie 1969 als das Jahr zusammen mit der falschen Stunde.Ich denke, so sollten Sie es machen, da moment.js keine
format
Funktion für die Dauer bietet . Oder Sie können einen einfachen Wrapper schreiben, um ihn einfacher / schöner zu machen.quelle
Dies sollte gut funktionieren.
quelle
Wenn wir nur hh: mm: ss wollen, können wir eine Funktion wie diese verwenden:
quelle
Benutze das,
quelle
Anstatt
Es ist besser zu tun
quelle
Verwenden Sie in ES8 jetzt Moment und beginnen Sie, Momentobjekte zu sein.
quelle
Typoskript: Folgendes sollte funktionieren,
quelle
Ich erstelle eine einfache Funktion mit Typoskript
zum Generieren von Javascript https://www.typescriptlang.org/play/index.html
quelle
InTime = 06: 38, Outtime = 15: 40
quelle
DATUM ZEITBASIERTER EINGANG
AUSGABE
quelle
EPOCH-ZEITUNTERSCHIED MIT MOMENTJS :
So erhalten Sie einen Unterschied zwischen zwei Epochen:
Syntax:
moment.duration(moment(moment(date1).diff(moment(date2)))).asHours()
Stundenunterschied:
moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asHours()
Unterschied in Minuten:
moment.duration(moment(moment(1590597744551).diff(moment(1590597909877)))).asMinutes().toFixed()
Hinweis: Sie können entfernen
.toFixed()
wenn Sie genaue Werte benötigen.Code:
Siehe Arbeitsbeispiel hier: https://repl.it/repls/MoccasinDearDimension
quelle