¿Cómo formateo una fecha como ISO 8601 en moment.js?

201

Estos documentos mencionan moment.ISO_8601como una opción de formato (de 2.7.0 - http://momentjs.com/docs/#/parsing/special-formats/ ), pero ninguno de estos funciona (incluso 2.7.0):

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

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

¿Cómo puedo obtener un ISO 8601 de moment.js?

sennett
fuente
¿Qué versión de momento estás usando? Los documentos dicen que la constante se agregó en 2.7.0.
Joe
@joews 2.7.0. Aclarado en cuestión. Vea mi respuesta, lo descubrí. Sin embargo, los documentos no son muy claros.
sennett
Sí, solo mencionan formatos especiales en el contexto del análisis. Impar.
Joe
2
puedes probarmoment().toISOString()
Saahithyan Vigneswaran

Respuestas:

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

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

Actualización Basado en la respuesta: por @sennet y el comentario de @dvlsg (ver Fiddle ) hay que señalar que hay una diferencia entre formaty toISOString. Ambos son correctos pero el proceso subyacente difiere. toISOStringse convierte en un objeto Date, se establece en UTC y luego usa la función de prototipo Date nativa para generar ISO8601 en UTC con milisegundos ( YYYY-MM-DD[T]HH:mm:ss.SSS[Z]). Por otro lado, formatusa el formato predeterminado ( YYYY-MM-DDTHH:mm:ssZ) sin milisegundos y mantiene el desplazamiento de la zona horaria.

Abrí un problema porque creo que puede conducir a resultados inesperados.

cyberwombat
fuente
1
Estoy de acuerdo contigo @Yashua. Creo que se debe evitar el uso de "format ()" porque no es intuitivo. Tampoco creo que deba existir una función que simplemente envuelva el "toISOString ()" nativo. Dicho esto, quizás dar una nueva función como: "toISO8601 ()" con la opción de mantener la zona horaria y una documentación adecuada será mejor.
Greivin López
44
Si desea el tiempo utc, pero formateado a su manera, en lugar de ISO8601, puede hacer lo siguiente:moment().utc().format("OUTPUT_FORMAT")
StinkyCat
Útil cuando se formatea una fecha en kibana pero no tienes acceso a JS.
Brice
1
Si desea mantener la zona horaria local, use moment().toISOString(true);.
Benny Neugebauer
83

Usar formatsin parámetros:

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

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

sennett
fuente
31
Solo como nota al margen, estas dos respuestas no son las mismas, a pesar de que ambas cumplen con los requisitos de formato ISO. date.toISOString()mantendrá los milisegundos y usará utc, soltará date.format()los milisegundos y usará su zona horaria local (o al menos, ese es el comportamiento que estoy obteniendo actualmente en Chrome - jsfiddle.net/8gvhL1dz/22 )
dvlsg
El uso de .format () con una configuración regional árabe conduce a símbolos árabes en lugar de ingleses, lo que probablemente no sea deseable.
user393274
toISOString no se emite en su zona horaria local, siempre está en UTC (desplazamiento cero).
JoeTidee
11

También es posible con vanilla JS

new Date().toISOString() // "2017-08-26T16:31:02.349Z"
artnikpro
fuente
3
Solo si lo desea en UTC, sin mantener la zona horaria.
JoeTidee
8

Cuando usa Mongoose para almacenar fechas en MongoDB, debe usar toISOString () porque todas las fechas se almacenan como fechas ISO con milisegundos.

moment.format() 

2018-04-17T20:00:00Z

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

2018-04-17T20:00:00.000Z
administrador de página web
fuente
3

Si solo desea la parte de la fecha (por ejemplo, 2017-06-27), y desea que funcione independientemente de la zona horaria y también en árabe, aquí está el código que escribí:

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
}
usuario393274
fuente
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
fuente
2
Si bien este código puede proporcionar una solución a la pregunta, es mejor agregar contexto sobre por qué / cómo funciona. Esto puede ayudar a los futuros usuarios a aprender y aplicar ese conocimiento a su propio código. También es probable que reciba comentarios positivos de los usuarios en forma de votos a favor, cuando se explique el código.
borchvm