Verwenden Sie momentjs, um das Datum in eine Epoche und dann wieder auf das Datum umzuwandeln

76

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

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);

Rendern

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

Ian Davis
quelle
1
Ich erhalte diese Warnung für die erste Zeile: Verfallswarnung: Moment, in dem die Konstruktion auf js Datum zurückfällt. Dies wird nicht empfohlen und wird in der kommenden Hauptversion entfernt. Weitere Informationen finden Sie unter github.com/moment/moment/issues/1407 .
Timaschew

Antworten:

165

Hier sind ein paar Dinge falsch:

  • Erstens Terminologie. "Epoche" bezieht sich auf den Ausgangspunkt von etwas. Die "Unix-Epoche" ist Mitternacht, 1. Januar 1970 UTC. Sie können keine beliebige "Datumszeichenfolge in Epoche" konvertieren. Sie meinten wahrscheinlich "Unix Time" , was fälschlicherweise oft als "Epoch Time" bezeichnet wird.

  • .unix()Gibt die Unix-Zeit in ganzen Sekunden zurück, aber der Standardkonstruktor momentakzeptiert einen Zeitstempel in Millisekunden . Sie sollten stattdessen verwenden .valueOf(), um Millisekunden zurückzugeben. Beachten Sie, dass das Aufrufen .unix()*1000ebenfalls funktionieren würde, jedoch zu einem Genauigkeitsverlust führen würde.

  • Sie analysieren eine Zeichenfolge, ohne einen Formatbezeichner anzugeben. 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önnen. (Aus diesem Grund wird in der Konsole auch die Warnung "Veraltet" angezeigt.) Geben Sie stattdessen eine Formatzeichenfolge an , die der erwarteten Eingabe entspricht, z.

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

  • Um Ihre Fragen in 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 Zeitzone US-Pazifik ergibt sich Folgendes:

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

Da der Eingabewert als Ortszeit interpretiert wird, erhalten Sie einen anderen Wert, tswenn Sie sich in einer anderen Zeitzone befinden.

Beachten Sie auch, dass, wenn Sie wirklich mit ganzen Sekunden arbeiten möchten (möglicherweise an Präzision verlieren), der Moment auch Methoden dafür hat. Sie würden verwenden .unix(), um den Zeitstempel in ganzen Sekunden zurückzugeben und moment.unix(ts)ihn 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);
Matt Johnson-Pint
quelle
3
.valueOf()+moment()
Unterhaltsame
14

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

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

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

moment("10/15/2014 9:00", "MM/DD/YYYY HH:mm").valueOf()
timaschew
quelle
2
Bitte beziehen Sie sich auf github.com/moment/moment/issues/1407. Die oben beschriebene Methode wird derzeit abgeschrieben.
Kennedy Nyaga
3
Eine bessere, genauere Option ist die Verwendung vonvalueOf()
reectrix