¿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?


¿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.


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/ )


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"

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

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
}

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
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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.