web-dev-qa-db-fra.com

Comment formater une date au format ISO 8601 dans moment.js?

Cette documentation mentionne moment.ISO_8601 comme option de formatage (à partir de 2.7.0 - http://momentjs.com/docs/#/parsing/special-formats/ ), mais aucune de ces méthodes ne fonctionne. (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 une ISO 8601 de moment.js?

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

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

Update Basé sur la réponse: by @sennet et le commentaire de @dvlsg (voir Fiddle ), il convient de noter qu'il est une différence entre format et toISOString. Les deux sont corrects mais le processus sous-jacent diffère. toISOString est converti en un objet Date, les jeux en UTC utilisent ensuite la fonction prototype Date native pour générer ISO8601 en UTC en millisecondes (YYYY-MM-DD[T]HH:mm:ss.SSS[Z]). D'autre part, format utilise le format par défaut (YYYY-MM-DDTHH:mm:ssZ) sans millisecondes et conserve le décalage du fuseau horaire.

J'ai ouvert un numéro car je pense que cela peut conduire à des résultats inattendus.

274
cyberwombat

Utilisez format sans paramètres:

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

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

70
sennett

Aussi possible avec Vanilla JS

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

Lorsque vous utilisez Mongoose pour stocker des dates dans MongoDB, vous devez utiliser toISOString (), car toutes les dates sont stockées sous la forme ISOdates avec des millisecondes.

moment.format() 

2018-04-17T20:00:00Z

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

2018-04-17T20:00:00.000Z
6
webmaster

Si vous voulez seulement la portion de date (par exemple, 2017-06-27) et que vous voulez que cela fonctionne quel que soit le fuseau horaire et aussi 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
}
4
user393274