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
javascript
date
momentjs
Ian Davis
quelle
quelle
Antworten:
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 Standardkonstruktormoment
akzeptiert einen Zeitstempel in Millisekunden . Sie sollten stattdessen verwenden.valueOf()
, um Millisekunden zurückzugeben. Beachten Sie, dass das Aufrufen.unix()*1000
ebenfalls 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:
Da der Eingabewert als Ortszeit interpretiert wird, erhalten Sie einen anderen Wert,
ts
wenn 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 undmoment.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);
quelle
.valueOf()
+moment()
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()
quelle
valueOf()