Wie formatiere ich ein Datum in moment.js als ISO 8601?

201

In diesem Dokument wird moment.ISO_8601als Formatierungsoption erwähnt (ab 2.7.0 - http://momentjs.com/docs/#/parsing/special-formats/ ), aber keine dieser Funktionen (auch nicht 2.7.0):

var date = moment();
date.format(moment.ISO_8601); // error
moment.format(date, moment.ISO_8601); // error

( http://jsfiddle.net/b3d6uy05/1/ )

Wie kann ich eine ISO 8601 von moment.js erhalten?

Sennett
quelle
Welche Version des Moments verwenden Sie? Die Dokumente sagen, dass die Konstante in 2.7.0 hinzugefügt wurde.
Joews
@joews 2.7.0. In Frage gestellt. Siehe meine Antwort, ich habe es herausgefunden. Docs nicht sehr klar.
Sennett
Ja, sie erwähnen nur spezielle Formate im Zusammenhang mit dem Parsen. Seltsam.
Joews
2
Sie können versuchenmoment().toISOString()
Saahithyan Vigneswaran

Antworten:

339
moment().toISOString(); // or format() - see below

http://momentjs.com/docs/#/displaying/as-iso-string/

Update Basierend auf der Antwort: von @sennet und dem Kommentar von @dvlsg (siehe Geige ) sollte beachtet werden, dass es einen Unterschied zwischen formatund gibt toISOString. Beide sind korrekt, aber der zugrunde liegende Prozess unterscheidet sich. toISOStringKonvertiert in ein Date-Objekt, setzt auf UTC und verwendet dann die native Date-Prototyp-Funktion, um ISO8601 in UTC mit Millisekunden ( YYYY-MM-DD[T]HH:mm:ss.SSS[Z]) auszugeben . formatVerwendet andererseits das Standardformat ( YYYY-MM-DDTHH:mm:ssZ) ohne Millisekunden und behält den Zeitzonenversatz bei.

Ich habe ein Problem geöffnet , da ich denke, dass es zu unerwarteten Ergebnissen führen kann.

Cyberwombat
quelle
1
Ich stimme dir zu @Yashua. Ich denke, die Verwendung von "format ()" sollte vermieden werden, da dies nicht intuitiv ist. Ich denke auch nicht, dass eine Funktion, die nur das native "toISOString ()" umschließt, überhaupt existieren sollte. Abgesehen davon ist es vielleicht besser, eine neue Funktion wie "toISO8601 ()" mit der Option, die Zeitzone und eine ordnungsgemäße Dokumentation beizubehalten, anzugeben.
Greivin López
4
Wenn Sie die utc-Zeit möchten, aber auf Ihre eigene Weise formatieren möchten, können Sie anstelle von ISO8601 Folgendes tun:moment().utc().format("OUTPUT_FORMAT")
StinkyCat
Nützlich, wenn Sie ein Datum in Kibana formatieren, aber keinen Zugriff auf JS haben.
Brice
1
Wenn Sie die lokale Zeitzone beibehalten möchten, verwenden Sie moment().toISOString(true);.
Benny Neugebauer
81

Verwendung formatohne Parameter:

var date = moment();
date.format(); // "2014-09-08T08:02:17-05:00"

( http://jsfiddle.net/8gvhL1dz/ )

Sennett
quelle
31
Nur als Randnotiz sind diese beiden Antworten nicht gleich, obwohl sie beide die Anforderungen des ISO-Formats erfüllen. date.toISOString()wird die Millisekunden behalten und utc verwenden, date.format()wird die Millisekunden löschen und Ihre lokale Zeitzone verwenden (oder zumindest das ist das Verhalten, das ich derzeit in chrome
jsfiddle.net/8gvhL1dz/22
Die Verwendung von .format () mit einem arabischen Gebietsschema führt eher zu arabischen als zu englischen Symbolen, was wahrscheinlich unerwünscht ist.
user393274
toISOString wird nicht in Ihrer lokalen Zeitzone ausgegeben - es ist immer in (Nullpunktverschiebung) UTC.
JoeTidee
11

Auch mit Vanille JS möglich

new Date().toISOString() // "2017-08-26T16:31:02.349Z"
artnikpro
quelle
3
Nur wenn Sie es in UTC möchten, ohne die Zeitzone beizubehalten.
JoeTidee
8

Wenn Sie Mongoose zum Speichern von Daten in MongoDB verwenden, müssen Sie toISOString () verwenden, da alle Daten als ISO-Daten mit Millisekunden gespeichert werden.

moment.format() 

2018-04-17T20:00:00Z

moment.toISOString() -> USE THIS TO STORE IN MONGOOSE

2018-04-17T20:00:00.000Z
Webmaster
quelle
3

Wenn Sie nur den Datumsteil (z. B. 27.06.2017) möchten und möchten, dass er unabhängig von der Zeitzone und auch auf Arabisch funktioniert, habe ich folgenden Code:

function isoDate(date) {
    if (!date) {
        return null
    }
    date = moment(date).toDate()

    // don't call toISOString because it takes the time zone into
    // account which we don't want.  Also don't call .format() because it
    // returns Arabic instead of English

    var month = 1 + date.getMonth()
    if (month < 10) {
        month = '0' + month
    }
    var day = date.getDate()
    if (day < 10) {
        day = '0' + day
    }
    return date.getFullYear() + '-' + month + '-' + day
}
user393274
quelle
0
var x = moment();

//date.format(moment.ISO_8601); // error

moment("2010-01-01T05:06:07", ["YYYY", moment.ISO_8601]);; // error
document.write(x);
Nishith
quelle
2
Während dieser Code eine Lösung für die Frage bietet, ist es besser, einen Kontext hinzuzufügen, warum / wie er funktioniert. Dies kann zukünftigen Benutzern helfen, zu lernen und dieses Wissen auf ihren eigenen Code anzuwenden. Es ist auch wahrscheinlich, dass Sie positive Rückmeldungen von Benutzern in Form von Upvotes erhalten, wenn der Code erklärt wird.
Borchvm