Comment formater une date en ISO 8601 dans moment.js?

201

Ces documents mentionnent moment.ISO_8601comme option de mise en forme (à partir de 2.7.0 - http://momentjs.com/docs/#/parsing/special-formats/ ), mais aucun de ces travaux (même 2.7.0):

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

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

Comment puis-je obtenir un ISO 8601 de moment.js?

sennett
la source
Quelle version de moment utilisez-vous? Les docs disent que constante a été ajoutée dans 2.7.0.
joews
@joews 2.7.0. Clarifié en question. Voir ma réponse, je l'ai compris. Les documents ne sont cependant pas très clairs.
sennett
Oui, ils ne mentionnent que des formats spéciaux dans le contexte de l'analyse. Impair.
joews
2
vous pouvez essayermoment().toISOString()
Saahithyan Vigneswaran

Réponses:

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

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

Mise à jour Sur la base de la réponse: par @sennet et le commentaire de @dvlsg (voir Fiddle ), il convient de noter qu'il existe une différence entre formatet toISOString. Les deux sont corrects mais le processus sous-jacent diffère. toISOStringconvertit en un objet Date, prend la valeur UTC puis utilise la fonction prototype native Date pour produire ISO8601 en UTC avec des millisecondes ( YYYY-MM-DD[T]HH:mm:ss.SSS[Z]). En revanche, formatutilise le format par défaut ( YYYY-MM-DDTHH:mm:ssZ) sans millisecondes et conserve le décalage du fuseau horaire.

J'ai ouvert un problème car je pense qu'il peut conduire à des résultats inattendus.

cyberwombat
la source
1
Je suis d'accord avec toi @Yashua. Je pense que l'utilisation de "format ()" doit être évitée car elle n'est pas intuitive. De plus, je ne pense pas qu'une fonction qui enveloppe simplement le "toISOString ()" natif ne devrait exister du tout. Cela étant dit, donner peut-être une nouvelle fonction comme: "toISO8601 ()" avec l'option de conserver le fuseau horaire et une documentation appropriée sera mieux.
Greivin López
4
Si vous voulez le temps utc, mais formaté à votre façon, au lieu de ISO8601, vous pouvez faire ce qui suit:moment().utc().format("OUTPUT_FORMAT")
StinkyCat
Utile pour formater une date en kibana mais vous n'avez pas accès à JS.
Brice
1
Si vous souhaitez conserver le fuseau horaire local, utilisez moment().toISOString(true);.
Benny Neugebauer
83

Utilisation formatsans paramètres:

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

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

sennett
la source
31
À titre de remarque, ces deux réponses ne sont pas identiques, même si elles répondent toutes les deux aux exigences du format ISO. date.toISOString()conservera les millisecondes et utilisera utc, date.format()supprimera les millisecondes et utilisera votre fuseau horaire local (ou du moins, c'est le comportement que j'obtiens actuellement dans chrome - jsfiddle.net/8gvhL1dz/22 )
dvlsg
L'utilisation de .format () avec des paramètres régionaux arabes conduit à des symboles arabes plutôt qu'à des symboles anglais, ce qui n'est probablement pas souhaitable.
user393274
toISOString ne sort pas dans votre fuseau horaire local - il est toujours en (décalage zéro) UTC.
JoeTidee
11

Également possible avec vanilla JS

new Date().toISOString() // "2017-08-26T16:31:02.349Z"
artnikpro
la source
3
Seulement si vous le souhaitez en UTC, sans maintenir le fuseau horaire.
JoeTidee
8

Lorsque vous utilisez Mongoose pour stocker des dates dans MongoDB, vous devez utiliser toISOString () car toutes les dates sont stockées en tant que dates ISO avec des millisecondes.

moment.format() 

2018-04-17T20:00:00Z

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

2018-04-17T20:00:00.000Z
webmaster
la source
3

Si vous voulez juste la partie date (par exemple 2017-06-27), et que vous voulez qu'elle fonctionne indépendamment du fuseau horaire et également en arabe, voici le code que j'ai écrit:

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
la source
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
la source
2
Bien que ce code puisse fournir une solution à la question, il est préférable d'ajouter du contexte pour expliquer pourquoi / comment cela fonctionne. Cela peut aider les futurs utilisateurs à apprendre et à appliquer ces connaissances à leur propre code. Vous êtes également susceptible d'avoir des commentaires positifs des utilisateurs sous la forme de votes positifs, lorsque le code est expliqué.
borchvm