¿Cómo puedo generar una cadena con formato ISO 8601 en JavaScript?
Tengo un Date
objeto. ¿ Cómo renderizo la title
parte 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"
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())
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
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.
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.