¿Cómo puedo generar una cadena con formato ISO 8601 en JavaScript?

Resuelto James A. Rosen asked hace 14 años • 16 respuestas

Tengo un Dateobjeto. ¿ Cómo renderizo la titleparte del siguiente fragmento?

<abbr title="2010-04-02T14:12:07">A couple days ago</abbr>

Tengo la parte "tiempo relativo en palabras" de otra biblioteca.

Intenté lo siguiente:

function isoDate(msSinceEpoch) {

   var d = new Date(msSinceEpoch);
   return d.getUTCFullYear() + '-' + (d.getUTCMonth() + 1) + '-' + d.getUTCDate() + 'T' +
          d.getUTCHours() + ':' + d.getUTCMinutes() + ':' + d.getUTCSeconds();

}

Pero eso me da:

"2010-4-2T3:19"
James A. Rosen avatar Apr 04 '10 11:04 James A. Rosen
Aceptado

Ya existe una función llamada toISOString():

var date = new Date();
date.toISOString(); //"2011-12-19T15:28:46.493Z"

Si, de alguna manera, estás en un navegador que no lo admite, te tengo cubierto:

if (!Date.prototype.toISOString) {
  (function() {

    function pad(number) {
      var r = String(number);
      if (r.length === 1) {
        r = '0' + r;
      }
      return r;
    }

    Date.prototype.toISOString = function() {
      return this.getUTCFullYear() +
        '-' + pad(this.getUTCMonth() + 1) +
        '-' + pad(this.getUTCDate()) +
        'T' + pad(this.getUTCHours()) +
        ':' + pad(this.getUTCMinutes()) +
        ':' + pad(this.getUTCSeconds()) +
        '.' + String((this.getUTCMilliseconds() / 1000).toFixed(3)).slice(2, 5) +
        'Z';
    };

  }());
}

console.log(new Date().toISOString())
Expandir fragmento

Anatoly Mironov avatar Dec 19 '2011 15:12 Anatoly Mironov

Vea el último ejemplo en la página https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference:Global_Objects:Date :

/* Use a function for the exact format desired... */
function ISODateString(d) {
    function pad(n) {return n<10 ? '0'+n : n}
    return d.getUTCFullYear()+'-'
         + pad(d.getUTCMonth()+1)+'-'
         + pad(d.getUTCDate())+'T'
         + pad(d.getUTCHours())+':'
         + pad(d.getUTCMinutes())+':'
         + pad(d.getUTCSeconds())+'Z'
}

var d = new Date();
console.log(ISODateString(d)); // Prints something like 2009-09-28T19:03:12Z
dev-null-dweller avatar Apr 05 '2010 15:04 dev-null-dweller

Nota : esta respuesta todavía recibe votos positivos a partir de 2022-03. La biblioteca moment.js está en desuso . Estas son las dos alternativas principales: Luxon y Day.js ; otras se mencionan en el enlace de obsolescencia.

Luxón

Se puede considerar a Luxon como la evolución de Moment. Su autor es Isaac Cambron , colaborador de Moment desde hace mucho tiempo. Lea ¿Por qué existe Luxon? y las páginas de usuarios de For Moment en la documentación de Luxon.

Locales: Intl proporcionado Zonas horarias: Intl proporcionado

día.js

Day.js está diseñado para ser un reemplazo minimalista de Moment.js, utilizando una API similar. No es un reemplazo directo, pero si está acostumbrado a usar la API de Moment y desea comenzar a moverse rápidamente, considere usar Day.js.

Configuraciones regionales: archivos de datos personalizados que se pueden importar individualmente Zonas horarias: Se proporciona internacional, a través de un complemento

Utilizo Day.js debido a la diferencia de tamaño, pero Luxon es más fácil de manejar.


Casi todos los métodos a ISO en la web eliminan la información de la zona horaria aplicando una conversión a la hora "Z"ulu (UTC) antes de generar la cadena. El .toISOString() nativo del navegador también elimina información de zona horaria.

Esto descarta información valiosa, ya que el servidor o el destinatario siempre puede convertir una fecha ISO completa a la hora zulú o cualquier zona horaria que requiera, sin dejar de obtener la información de la zona horaria del remitente.

La mejor solución que he encontrado es usar la biblioteca javascript Moment.js y usar el siguiente código:

Para obtener la hora ISO actual con información de zona horaria y milisegundos

now = moment().format("YYYY-MM-DDTHH:mm:ss.SSSZZ")
// "2013-03-08T20:11:11.234+0100"

now = moment().utc().format("YYYY-MM-DDTHH:mm:ss.SSSZZ")
// "2013-03-08T19:11:11.234+0000"

now = moment().utc().format("YYYY-MM-DDTHH:mm:ss") + "Z"
// "2013-03-08T19:11:11Z" <- better use the native .toISOString() 

Para obtener la hora ISO de un objeto Date de JavaScript nativo con información de zona horaria pero sin milisegundos

var current_time = Date.now();
moment(current_time).format("YYYY-MM-DDTHH:mm:ssZZ")

Esto se puede combinar con Date.js para obtener funciones como Date.today() cuyo resultado luego se puede pasar al momento.

Una cadena de fecha con formato como este es compatible con JSON y se presta bien para almacenarse en una base de datos. A Python y C# parece gustarles.

Daniel F avatar Mar 08 '2013 19:03 Daniel F

La pregunta formulada fue el formato ISO con precisión reducida. Listo:

 new Date().toISOString().slice(0, 19) + 'Z'
 // '2014-10-23T13:18:06Z'

Suponiendo que se desea la Z final, de lo contrario simplemente omítala.

arcseldon avatar Oct 23 '2014 13:10 arcseldon