Verwenden Sie momentjs, um das Datum in eine Epoche und dann zurück in das Datum zu konvertieren

Lesezeit: 3 Minuten

Ich versuche, eine Datumszeichenfolge in eine Epoche zu konvertieren und dann eine Epoche zurück in die Datumszeichenfolge, um zu überprüfen, ob ich die richtige Datumszeichenfolge bereitstelle.

var epoch = moment("10/15/2014 9:00").unix(); // do I need to do .local()?
var momentDate = moment(epoch); // I've also tried moment.utc(epoch) 
var momentDateStr = momentDate.calendar();
alert("Values are: epoch = " + epoch + ", momentDateStr = " + momentDateStr);

Rendert

Values are: epoch = 1413378000, momentDateStr = 01/17/1970

Hinweis: Ich verwende die folgende Version des Moment-js-Skripts, //cdnjs.cloudflare.com/ajax/libs/moment.js/2.8.3/moment-with-locales.js

  • Ich erhalte diese Warnung für die erste Zeile: Deprecation warning: moment construction fällt back to js Date. Davon wird abgeraten und es wird in der kommenden Hauptversion entfernt. Bitte beziehen Sie sich auf github.com/moment/moment/issues/1407 Für mehr Information.

    – Timaschew

    15. Oktober 2014 um 22:09 Uhr


Hier stimmt einiges nicht:

  • Erstens, Terminologie. “Epoche” bezieht sich auf den Ausgangspunkt von etwas. Die „Unix-Epoche“ ist Mitternacht, der 1. Januar 1970 UTC. Sie können keine beliebige “Datumszeichenfolge in Epoche” umwandeln. Sie meinten wahrscheinlich “Unix-Zeit”die oft fälschlicherweise als „Epochenzeit“ bezeichnet wird.

  • .unix() gibt die Unix-Zeit in ganzen Sekunden zurück, aber den Standardwert moment Der Konstruktor akzeptiert einen Zeitstempel in Millisekunden. Sie sollten stattdessen verwenden .valueOf() um Millisekunden zurückzugeben. Beachten Sie das Aufrufen .unix()*1000 würde auch funktionieren, würde aber zu Präzisionsverlusten führen.

  • Sie analysieren eine Zeichenfolge, ohne einen Formatbezeichner bereitzustellen. Das ist keine gute Idee, da Werte wie 1/2/2014 je nach Gebietsschema, in dem der Code ausgeführt wird, entweder als 1. Februar oder als 2. Januar interpretiert werden könnten. (Aus diesem Grund erhalten Sie auch die Verfallswarnung in der Konsole.) Geben Sie stattdessen a Zeichenfolge formatieren die mit der erwarteten Eingabe übereinstimmt, z. B.:

    moment("10/15/2014 9:00", "M/D/YYYY H:mm")
    
  • .calendar() hat eine ganz bestimmte Verwendung. Wenn Sie sich dem Datum nähern, wird ein Wert wie „Heute 9:00 Uhr“ zurückgegeben. Wenn Sie das nicht erwartet haben, sollten Sie die verwenden .format() funktionieren stattdessen. Auch hier möchten Sie vielleicht einen Formatbezeichner übergeben.

  • Um Ihre Fragen in den Kommentaren zu beantworten, Nein – Sie müssen nicht anrufen .local() oder .utc().

Alles zusammen:

var ts = moment("10/15/2014 9:00", "M/D/YYYY H:mm").valueOf();
var m = moment(ts);
var s = m.format("M/D/YYYY H:mm");
alert("Values are: ts = " + ts + ", s = " + s);

Auf meinem Computer in der US-Pazifik-Zeitzone führt dies zu:

Werte sind: ts = 1413388800000, s = 15.10.2014 9:00

Da der Eingabewert in Bezug auf die Ortszeit interpretiert wird, erhalten Sie einen anderen Wert für ts wenn Sie sich in einer anderen Zeitzone befinden.

Beachten Sie auch, dass Moment auch Methoden dafür hat, wenn Sie wirklich mit ganzen Sekunden arbeiten möchten (wodurch möglicherweise die Genauigkeit verloren geht). Du würdest verwenden .unix() um den Zeitstempel in ganzen Sekunden zurückzugeben, und moment.unix(ts) um es auf einen Moment zurück zu analysieren.

var ts = moment("10/15/2014 9:00", "M/D/YYYY H:mm").unix();
var m = moment.unix(ts);

  • Lustige Abkürzung für .valueOf() -> +moment()

    – Adam Moisa

    14. September 2018 um 20:50 Uhr


Benutzer-Avatar
timaschew

http://momentjs.com/docs/#/displaying/unix-timestamp/

Sie erhalten die Anzahl der Unix-Sekunden, nicht der Millisekunden!

Sie müssen es mit multiplizieren 1000 oder verwenden valueOf() und vergessen Sie nicht, einen Formatierer zu verwenden, da Sie ein Nicht-ISO-8601-Format verwenden. Und wenn Sie vergessen, den Formatierer zu übergeben, wird das Datum in der UTC-Zeitzone oder als ungültiges Datum geparst.

moment("10/15/2014 9:00", "MM/DD/YYYY HH:mm").valueOf()

  • Bitte beziehen Sie sich auf github.com/moment/moment/issues/1407 Die obige Methode wird derzeit abgeschrieben.

    – Kennedy Nyaga

    18. November 2015 um 5:37 Uhr


  • Eine bessere und genauere Option ist die Verwendung valueOf()

    – Reektrix

    11. Juni 2018 um 22:39 Uhr

1175580cookie-checkVerwenden Sie momentjs, um das Datum in eine Epoche und dann zurück in das Datum zu konvertieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy