2014-09-08 16 views
89

Diese Dokumente erwähnen moment.ISO_8601 als Formatierungsoption (von 2.7.0 - http://momentjs.com/docs/#/parsing/special-formats/), aber keiner dieser Arbeit (auch 2.7.0):Wie formatiere ich ein Datum als ISO 8601 in moment.js?

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 bekommen ISO 8601 von moment.js?

+0

Welche Version von Moment verwenden Sie? Die Dokumentation sagt, dass Konstante in 2.7.0 hinzugefügt wurde. – joews

+0

@joews 2.7.0. In Frage gestellt. Sehen Sie meine Antwort Ich habe es herausgefunden. Docs nicht sehr klar, obwohl. – sennett

+0

Ja, sie erwähnen nur spezielle Formate im Zusammenhang mit dem Parsen. Ungerade. – joews

Antwort

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

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

aktualisieren Auf der Grundlage der Antwort: durch @sennet und der Kommentar von @dvlsg (siehe Fiddle) sollte es beachtet werden dass es einen Unterschied zwischen format und toISOString gibt. Beide sind korrekt, aber der zugrundeliegende Prozess unterscheidet sich. toISOString konvertiert in ein Date-Objekt, setzt auf UTC und verwendet dann die native Date-Prototypfunktion, um ISO8601 in UTC mit Millisekunden (YYYY-MM-DD[T]HH:mm:ss.SSS[Z]) auszugeben. Auf der anderen Seite verwendet format das Standardformat (YYYY-MM-DDTHH:mm:ssZ) ohne Millisekunden und behält den Zeitzonen-Offset bei.

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

+0

Ich stimme dir zu @ Yashua. Ich denke, die Verwendung von "format()" sollte vermieden werden, weil es nicht intuitiv ist. Ich glaube auch nicht, dass eine Funktion, die nur den nativen "toISOString()" umschließt, überhaupt existieren sollte. Das heißt, vielleicht eine neue Funktion wie: "toISO8601()" mit der Option, die Zeitzone und eine ordnungsgemäße Dokumentation zu halten, wird besser sein. –

+1

Wenn Sie die UTC-Zeit möchten, aber Ihren eigenen Weg formatiert haben, statt ISO8601, können Sie Folgendes tun: 'moment() .utc(). Format (" OUTPUT_FORMAT ")' – StinkyCat

+0

Nützlich, wenn Sie ein Datum in kibana formatieren habe keinen Zugriff auf JS. – Brice

48

Verwenden format ohne Parameter:

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

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

+20

Nur als eine Randnotiz, diese beiden Antworten sind nicht die gleichen, obwohl beide ISO-Formatanforderungen erfüllen. 'date.toISOString()' wird die Millisekunden beibehalten und utc verwenden, 'date.format()' wird die Millisekunden fallen lassen und Ihre lokale Zeitzone verwenden (oder zumindest das Verhalten, das ich gerade in Chrome erhalte - http://jsfiddle.net/8gvhL1dz/22/) – dvlsg

+0

Die Verwendung von .format() mit einem arabischen Gebietsschema führt zu arabischen statt zu englischen Symbolen, was wahrscheinlich unerwünscht ist. – user393274

2

Wenn Sie nur den Datumsteil (zB 2017.06.27) wollen, und Sie wollen, dass es unabhängig von der Zeitzone, arbeiten und auch in Arabisch, hier ist Code, den ich schrieb:

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 
} 
4

auch möglich mit Vanille JS

new Date().toISOString() // "2017-08-26T16:31:02.349Z"