- La nueva API estándar Temporal, que reemplaza de raíz las limitaciones del objeto Date en JavaScript, llegó a ECMAScript Stage 4 tras 9 años de desarrollo
- Temporal ofrece tipos inmutables, soporte explícito de zona horaria y calendario y precisión de nanosegundos, eliminando la ambigüedad y los errores de
Date
- Diversas organizaciones como Bloomberg, Igalia, Microsoft, Google y Mozilla colaboraron en el diseño e implementación de la especificación, y lograron una cooperación entre múltiples motores con la biblioteca compartida en Rust
temporal_rs
- Temporal brinda soporte preciso para operaciones temporales y calendarios internacionalizados mediante tipos detallados como ZonedDateTime, Instant, PlainDate/Time y Duration
- Este estándar, que resuelve problemas acumulados durante 30 años, es valorado como un caso de éxito de colaboración e innovación abierta en el ecosistema de JavaScript
Los problemas del manejo del tiempo en JavaScript y la aparición de Temporal
- El objeto Date existente fue una adaptación directa del
Date de Java de 1995, y durante décadas ha sido fuente de bugs por problemas como mutabilidad, cálculos inconsistentes de meses y parsing ambiguo
- Ejemplo: errores al calcular fin de mes al usar
setMonth, y resultados distintos entre navegadores al parsear cadenas similares a ISO
- A medida que las aplicaciones web se volvieron más complejas desde la década de 2010, las limitaciones de
Date se hicieron más graves
- Los desarrolladores intentaron compensar estos problemas con bibliotecas externas como Moment.js, pero eso trajo mayor tamaño de bundle y carga de mantenimiento
- En 2017, Maggie Johnson-Pint presentó la propuesta de Temporal ante TC39, iniciando así la discusión para su estandarización
Colaboración entre TC39 y la industria
- Temporal comenzó en Stage 1 en 2018 y, tras 9 años, llegó a Stage 4 (estandarización)
- Bloomberg participó activamente para resolver problemas de zona horaria y precisión en entornos JavaScript a gran escala
- Requisitos: zonas horarias personalizadas, precisión histórica de zonas horarias basada en IANA y precisión de nanosegundos
- Se trabajó en el diseño e implementación de la especificación en colaboración con Igalia, Microsoft, Google y Mozilla
- Varios ingenieros participaron como champions, entre ellos Philipp Dunkel, Ujjwal Sharma, Philip Chimento, Shane Carr y Justin Grant
Tipos y funciones principales de Temporal
- Temporal.ZonedDateTime: representación inmutable de una fecha y hora que incluye zona horaria, calendario y ajuste de DST de forma explícita
- Ejemplo: si
01:30 no existe durante una transición de DST en Londres, se ajusta automáticamente a 02:30
- Temporal.Instant: representación de un instante absoluto sin zona horaria ni calendario, con precisión de nanosegundos
- Permite convertir el mismo instante a múltiples zonas horarias
- PlainDate / PlainTime / PlainDateTime / PlainYearMonth / PlainMonthDay: tipos de “reloj de pared” sin zona horaria
- Son adecuados para mostrar o calcular fechas y horas simples
- Temporal.Duration: representa intervalos de tiempo y permite convertir entre distintas unidades (
total({ unit: "second" }))
- Soporte de calendario: realiza correctamente operaciones con calendarios no gregorianos, como el hebreo
Implementación y proceso de estandarización
- Temporal es la adición más grande a la especificación en la historia de ECMAScript, con alrededor de 4,500 casos de prueba
- Se desarrolló la implementación compartida en Rust
temporal_rs, que motores como V8 y Boa usan en conjunto
- Ventajas: menor barrera de entrada, mantenimiento a largo plazo más sencillo y mejor calidad del código
- Durante 2024 y 2025,
temporal_rs alcanzó un 100% de pruebas aprobadas y fue considerado un caso exitoso de colaboración entre múltiples motores
Estado de soporte y retos futuros
- Temporal ya tiene soporte en Firefox 139, Chrome/Edge 144 y TypeScript 6.0 Beta
- Safari está en la etapa de technical preview, y Node.js 26 está previsto
- El siguiente reto es la integración con las Web APIs
- Ejemplo: soporte para tipos
Temporal en elementos de formulario como <input type="date">
- También se estudia la posibilidad de reemplazar
DOMHighResTimeStamp (con ejemplo de uso de Temporal.Now.instant())
Resultados de la colaboración y la innovación abierta
- Temporal es un estándar completado mediante 9 años de colaboración entre múltiples organizaciones, en los que participaron
- actores diversos como Microsoft, Google, Mozilla, Bloomberg, Igalia y Boa
temporal_rs es un caso exitoso del modelo de infraestructura compartida, y
- demuestra reducción de costos por implementaciones duplicadas, mayor consistencia y aceleración de la innovación
- Temporal es valorado no solo como una mejora de API, sino como una prueba de colaboración con la que la comunidad de JavaScript resolvió deuda técnica de largo plazo
- Después de 30 años, JavaScript finalmente cuenta con una API moderna de fecha y hora
7 comentarios
La complejidad del cálculo del tiempo se debe mucho más que a un problema de formatos a la filosofía humana, la precisión de la astronomía y la cultura. Hacer cálculos es fácil incluso solo con
long. Históricamente, en las líneas de tiempo hay muchos intervalos peculiares donde 1 + 1 no es 2, y gran parte de eso proviene de calendarios, casi como el I Ching, que cambian según la posición, como el ángulo del sol y la superficie terrestre. En esos casos, el calendario lunisolar coreano ni siquiera ha sido tema de discusión.Y eso lo determina el Instituto Coreano de Investigación en Astronomía.
¡Por fin! ¡Qué alegría!!
¡Por fin!!
¿ZonedDateTime...? ¡No me digas que tú también..!
Por fin
time.hde C ->java.util.Datede Java ->Datede JSjoda-timede Java -> JSR 310 ->java.time-> moment.js ->
Temporalde JSAsí ha sido el flujo, entonces.
Comentarios de Hacker News
La distinción entre un instante (
instant) y un datetime basado en calendario evita casi por completo los errores comunes que pasaban con DateEs un poco verboso, pero sigue siendo mucho mejor que recibir una llamada a las 3 a. m. para arreglar un bug de DST
Fue un issue que empezó en 2012 y al final terminó llegando a la librería estándar como solución
La discusión relacionada puede verse en este hilo de Google Groups
fromisoformatahora ya se siente demasiado poco intuitivoAntes usaba
ciso8601, pero desde que entró al estándar todo es mucho más simple y establey que en realidad él haya implementado todo por su cuenta como voluntario
Como comparto código entre cliente y servidor, intento separar estrictamente los datos y la lógica
Quiero mantener todos los datos como JSON puro para facilitar serialización y deserialización, pero los objetos de Temporal son instancias de clase con propiedades de función, y eso me resulta incómodo
Creo que un enfoque como
date-fns, donde se aplican funciones puras a objetos de solo datos, es mejorJSON.parseEl desarrollador tiene que reconstruir manualmente el objeto correcto a partir de la cadena ISO
Si se automatiza, existe el riesgo de terminar manejando tipos incorrectos
El ejemplo de reviver para
Temporal.Instanten la documentación puede servir de referenciaJSON.parse/stringifyhaga desaparecer el prototipo es un problema comúnPero creo que la elección del equipo de Temporal es la correcta. En la lógica de fecha y hora, la seguridad de tipos importa más que un enfoque simple de datos+funciones
Si encapsulas las operaciones en el objeto, evitas que un
PlainDatese trate por error como unZonedDateTimeEn cosas como
tRPC, basta con agregar una capa delgada en los bordes que convierta conTemporal.from()ytoString()Es un poco más incómodo, pero me parece mejor que renunciar a la seguridad de tipos
Datede JavaScript tienen el mismo problemaDate.toJSONexiste, pero al parsear JSON igual tienes que volver a convertir la cadena enDateTemporal es igual, y
date-fnsal final también trabaja con instancias nativas deDate.toString()yTemporal.from()JSON.parsepara que cree objetos Temporal automáticamenteIgual que con
Date, lo correcto es manejarlo explícitamente de esa maneraFelicidades a todos los champions que trabajaron en esto durante tanto tiempo
Disfruté mucho trabajar en
temporal_rsen los últimos añosComo la propuesta radical de JavaScript apareció en 2018, me da curiosidad si el enfoque de Java influyó en alguna medida
TC39 toma como referencia antecedentes de otros lenguajes, pero llega a consensos orientados a JavaScript
Creo que esta API es la implementación más pulida que expertos de JS han diseñado a lo largo de 9 años
También se puede ver algo sobre eso en este hilo de HN
porque
util.Datede Java en realidad ya era casi un port del APItime.hde CAhora parece que Safari se convirtió en el heredero espiritual de IE
El problema de IE no era la lentitud, sino que se quedó estancado desde una posición dominante
Ahora Chrome está en el lugar del imperio, y de hecho Safari y Firefox son más necesarios
El verdadero problema es que cada vez haya más sitios hechos solo para Chrome
DurationVer documentación de MDNDuration