Antecedentes
El Date
objeto de JavaScript rastrea el tiempo en UTC internamente, pero generalmente acepta entradas y produce salidas en la hora local de la computadora en la que se está ejecutando. Tiene muy pocas instalaciones para trabajar con el tiempo en otras zonas horarias.
La representación interna de un Date
objeto es un número único, que representa el número de milisegundos que han transcurrido desde entonces 1970-01-01 00:00:00 UTC
, independientemente de los segundos bisiestos. No hay zona horaria o formato de cadena almacenado en el objeto Fecha en sí. Cuando Date
se utilizan varias funciones del objeto, la zona horaria local de la computadora se aplica a la representación interna. Si la función produce una cadena, entonces la información de la ubicación de la computadora puede tomarse en consideración para determinar cómo producir esa cadena. Los detalles varían según la función, y algunos son específicos de la implementación.
Las únicas operaciones que el Date
objeto puede hacer con zonas horarias no locales son:
Puede analizar una cadena que contiene un desplazamiento numérico UTC de cualquier zona horaria. Utiliza esto para ajustar el valor que se analiza y almacena el equivalente UTC. La hora local original y el desplazamiento no se conservan en el Date
objeto resultante . Por ejemplo:
var d = new Date("2020-04-13T00:00:00.000+08:00");
d.toISOString() //=> "2020-04-12T16:00:00.000Z"
d.valueOf() //=> 1586707200000 (this is what is actually stored in the object)
En entornos que han implementado la API de internacionalización ECMASCript (también conocida como "Intl"), un Date
objeto puede producir una cadena específica de la localidad ajustada a un identificador de zona horaria dado. Esto se logra a través de la timeZone
opción toLocaleString
ay sus variaciones. La mayoría de las implementaciones admitirán identificadores de zona horaria de IANA, como 'America/New_York'
. Por ejemplo:
var d = new Date("2020-04-13T00:00:00.000+08:00");
d.toLocaleString('en-US', { timeZone: 'America/New_York' })
//=> "4/12/2020, 12:00:00 PM"
// (midnight in China on Apring 13th is noon in New York on April 12th)
La mayoría de los entornos modernos admiten el conjunto completo de identificadores de zona horaria de IANA ( consulte la tabla de compatibilidad aquí ). Sin embargo, tenga en cuenta que el único identificador requiere ser apoyada por Intl es 'UTC'
, por lo tanto usted debe comprobar cuidadosamente si es necesario apoyar los navegadores antiguos o entornos atípicos (por ejemplo, dispositivos IO ligeros).
Bibliotecas
Hay varias bibliotecas que se pueden usar para trabajar con zonas horarias. Aunque todavía no pueden hacer que el Date
objeto se comporte de manera diferente, generalmente implementan la base de datos estándar de zonas horarias de la IANA y proporcionan funciones para usarlo en JavaScript. Las bibliotecas modernas usan los datos de zona horaria proporcionados por la API Intl, pero las bibliotecas más antiguas suelen tener gastos generales, especialmente si se ejecuta en un navegador web, ya que la base de datos puede ser un poco grande. Algunas de estas bibliotecas también le permiten reducir selectivamente el conjunto de datos, ya sea por qué zonas horarias son compatibles y / o por el rango de fechas con las que puede trabajar.
Aquí están las bibliotecas a considerar:
Bibliotecas basadas en Intl
El nuevo desarrollo debe elegir una de estas implementaciones, que dependen de la API Intl para sus datos de zona horaria:
Bibliotecas no internacionales
Estas bibliotecas se mantienen, pero conllevan la carga de empaquetar sus propios datos de zona horaria, que pueden ser bastante grandes.
* Si bien Moment y Moment-Timezone se recomendaron anteriormente, el equipo de Moment ahora prefiere que los usuarios elijan Luxon para un nuevo desarrollo.
Bibliotecas descontinuadas
Estas bibliotecas se han descontinuado oficialmente y ya no se deben usar.
Propuestas Futuras
La propuesta temporal TC39 tiene como objetivo proporcionar un nuevo conjunto de objetos estándar para trabajar con fechas y horas en el lenguaje JavaScript. Esto incluirá soporte para un objeto con reconocimiento de zona horaria.