2014-09-08 22 views
89

Questa documenti menzionano moment.ISO_8601 come opzione di formattazione (da 2.7.0 - http://momentjs.com/docs/#/parsing/special-formats/), ma nessuno di questi lavori (anche 2.7.0):Come si formatta una data come 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/)

Come posso ottenere un ISO 8601 da moment.js?

+0

Quale versione di momento stai usando? I documenti dicono che la costante è stata aggiunta in 2.7.0. – joews

+0

@joews 2.7.0. Chiarito in questione. Vedi la mia risposta l'ho capito. Doc non molto chiaro però. – sennett

+0

Sì, citano solo formati speciali nel contesto dell'analisi. Dispari. – joews

risposta

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

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

Aggiornamento Sulla base della risposta: dal @sennet e il commento di @dvlsg (vedi Fiddle) dovrebbe essere notato che c'è una differenza tra format e toISOString. Entrambi sono corretti ma il processo sottostante è diverso. toISOString viene convertito in un oggetto Date, impostato su UTC, quindi viene utilizzata la funzione di prototipo Date nativo per l'output ISO8601 in UTC con millisecondi (YYYY-MM-DD[T]HH:mm:ss.SSS[Z]). D'altra parte, format utilizza il formato predefinito (YYYY-MM-DDTHH:mm:ssZ) senza millisecondi e mantiene l'offset del fuso orario.

Ho aperto un issue perché penso che possa portare a risultati imprevisti.

+0

Sono d'accordo con te @Yashua. Penso che l'uso di "format()" dovrebbe essere evitato perché non è intuitivo. Inoltre, non credo che una funzione che avvolge solo il nativo "toISOString()" debba esistere. Detto questo, forse dare una nuova funzione come: "toISO8601()" con l'opzione di mantenere il fuso orario e una documentazione adeguata sarà migliore. –

+1

Se vuoi il tempo di utc, ma formattato a tuo modo, invece di ISO8601, puoi fare quanto segue: 'momento(). Utc(). Format (" OUTPUT_FORMAT ")' – StinkyCat

+0

Utile quando si sta formando una data in kibana ma tu non ho accesso a JS. – Brice

48

Usa format senza parametri:

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

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

+20

Proprio come una nota a margine, queste due risposte non sono le stesse, anche se entrambi soddisfano i requisiti del formato ISO. 'date.toISOString()' manterrà i millisecondi e userà utc, 'date.format()' lascerà cadere i millisecondi e userà il fuso orario locale (o almeno, questo è il comportamento che sto ottenendo attualmente in chrome - http://jsfiddle.net/8gvhL1dz/22/) – dvlsg

+0

L'uso di .format() con una localizzazione araba porta a simboli arabi piuttosto che a quelli inglesi, il che probabilmente non è desiderabile. – user393274

2

Se si desidera solo la parte di data (ad esempio 2017/06/27), e si desidera farlo funzionare indipendentemente dal fuso orario e anche in arabo, qui è il codice che ho scritto:

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

anche possibile con vaniglia JS

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