Come posso formattare una data come ISO 8601 in moment.js?


201

Questo documento menziona moment.ISO_8601come un'opzione di formattazione (dalla 2.7.0 - http://momentjs.com/docs/#/parsing/special-formats/ ), ma nessuna di queste funzioni (anche 2.7.0):

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?


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

@joews 2.7.0. Chiarito in questione. Vedi la mia risposta, l'ho capito. I documenti non sono estremamente chiari però.
sennett,

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

2
puoi provaremoment().toISOString()
Saahithyan Vigneswaran,

Risposte:


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

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

Aggiornamento Sulla base della risposta: di @sennet e del commento di @dvlsg (vedi Fiddle ), va notato che c'è una differenza tra formate toISOString. Entrambi sono corretti ma il processo sottostante differisce. toISOStringconverte in un oggetto Date, imposta su UTC quindi utilizza la funzione prototipo Date nativa per generare ISO8601 in UTC con millisecondi ( YYYY-MM-DD[T]HH:mm:ss.SSS[Z]). D'altra parte, formatutilizza il formato predefinito ( YYYY-MM-DDTHH:mm:ssZ) senza millisecondi e mantiene l'offset del fuso orario.

Ho aperto un problema poiché penso che possa portare a risultati imprevisti.


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

4
Se vuoi il tempo utc, ma formattato a modo tuo, invece di ISO8601, puoi fare quanto segue:moment().utc().format("OUTPUT_FORMAT")
StinkyCat

Utile quando stai formando una data in kibana ma non hai accesso a JS.
Brice,

1
Se si desidera mantenere il fuso orario locale, utilizzare moment().toISOString(true);.
Benny Neugebauer,

83

Utilizzare formatsenza parametri:

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

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


31
Proprio come una nota a margine, queste due risposte non sono uguali, 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 tuo fuso orario locale (o almeno, questo è il comportamento che sto attualmente assumendo in Chrome - jsfiddle.net/8gvhL1dz/22 )
dvlsg

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

toISOString non viene emesso nel fuso orario locale: è sempre in UTC (offset zero).
JoeTidee,

11

Possibile anche con JS alla vaniglia

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

3
Solo se lo desideri in UTC, senza mantenere il fuso orario.
JoeTidee,

8

Quando si utilizza Mongoose per memorizzare le date in MongoDB, è necessario utilizzare toISOString () perché tutte le date vengono archiviate come date ISO con millisecondi.

moment.format() 

2018-04-17T20:00:00Z

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

2018-04-17T20:00:00.000Z

3

Se vuoi solo la parte della data (ad es. 27/06/2017) e vuoi che funzioni indipendentemente dal fuso orario e anche in arabo, ecco 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
}

0
var x = moment();

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

moment("2010-01-01T05:06:07", ["YYYY", moment.ISO_8601]);; // error
document.write(x);

2
Mentre questo codice può fornire una soluzione alla domanda, è meglio aggiungere un contesto sul perché / come funziona. Questo può aiutare gli utenti futuri a imparare e applicare tali conoscenze al proprio codice. È inoltre probabile che tu riceva un feedback positivo dagli utenti sotto forma di valutazioni, quando viene spiegato il codice.
Borchvm,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.