ES2026 Temporal API: El Fin del Sufrimiento Con Fechas en JavaScript
Hola HaWkers, despues de anos de espera y desarrollo, la Temporal API finalmente forma parte del ECMAScript 2026. Esta nueva API promete resolver los problemas historicos que todo desarrollador JavaScript enfrento al trabajar con fechas y horarios.
Vamos a explorar que cambia, como usar, y por que querras abandonar el objeto Date lo mas rapido posible.
El Problema Con Date
Por Que Date Es Tan Malo
El objeto Date de JavaScript fue copiado de Java 1.0 en 1995 y heredo todos sus problemas. El propio Java ya depreco la mayoria de los metodos originales.
Problemas clasicos:
// Meses comienzan en 0 (Enero = 0, no 1)
const fecha = new Date(2026, 0, 15); // 15 de Enero, no Febrero
// Mutabilidad inesperada
const original = new Date();
const copia = original;
copia.setMonth(5); // Ups, cambio el original tambien!
// Parsing inconsistente entre browsers
new Date('2026-01-15'); // Puede ser interpretado diferente
// Infierno de timezone
const local = new Date();
const utc = new Date(local.toISOString());
// Cual es la diferencia? Depende de donde estes
// Operaciones matematicas extranas
const d1 = new Date(2026, 0, 31);
d1.setMonth(1); // Deberia ser 31 de Febrero?
// En realidad se convierte en 3 de Marzo (overflow automatico)Por que existen bibliotecas:
Moment.js, date-fns, Luxon y Day.js existen precisamente porque Date es inadecuado para trabajo serio. Pero agregar dependencias para algo tan fundamental siempre fue suboptimo.
La Temporal API
Conceptos Fundamentales
La Temporal API introduce varios nuevos tipos, cada uno con proposito especifico.
Tipos principales:
| Tipo | Proposito | Ejemplo |
|---|---|---|
Temporal.Instant |
Momento exacto en el tiempo (UTC) | Timestamp de log |
Temporal.ZonedDateTime |
Fecha/hora con timezone | Hora de reunion |
Temporal.PlainDateTime |
Fecha/hora sin timezone | Hora local generica |
Temporal.PlainDate |
Solo fecha | Fecha de nacimiento |
Temporal.PlainTime |
Solo hora | Alarma |
Temporal.Duration |
Duracion | 2 horas y 30 minutos |
Principio fundamental:
"Cada tipo representa exactamente lo que necesitas - nada mas, nada menos."
Inmutabilidad
Todos los objetos Temporal son inmutables. Las operaciones retornan nuevos objetos.
// Temporal - inmutable y seguro
const fecha = Temporal.PlainDate.from('2026-01-15');
const proximoMes = fecha.add({ months: 1 });
console.log(fecha.toString()); // 2026-01-15 (no cambio!)
console.log(proximoMes.toString()); // 2026-02-15
// Comparacion con Date - mutable y peligroso
const fechaAntigua = new Date('2026-01-15');
fechaAntigua.setMonth(fechaAntigua.getMonth() + 1);
// Original fue modificado!
Ejemplos Practicos
Trabajando Con Fechas
Las operaciones comunes se vuelven mucho mas intuitivas.
// Crear una fecha
const cumpleanos = Temporal.PlainDate.from('2026-06-15');
// o
const cumpleanos2 = Temporal.PlainDate.from({
year: 2026,
month: 6,
day: 15
});
// Agregar/restar tiempo
const enUnaSemana = cumpleanos.add({ weeks: 1 });
const haceTresDias = cumpleanos.subtract({ days: 3 });
// Comparar fechas (finalmente tiene sentido!)
const hoy = Temporal.Now.plainDateISO();
if (Temporal.PlainDate.compare(cumpleanos, hoy) > 0) {
console.log('El cumpleanos aun no llego');
}
// Calcular diferencia
const diasHastaCumpleanos = hoy.until(cumpleanos, {
largestUnit: 'day'
});
console.log(`Faltan ${diasHastaCumpleanos.days} dias`);Trabajando Con Timezones
Los timezones dejan de ser una pesadilla.
// Crear fecha/hora con timezone
const reunion = Temporal.ZonedDateTime.from({
year: 2026,
month: 1,
day: 27,
hour: 15,
minute: 0,
timeZone: 'America/Mexico_City'
});
console.log(reunion.toString());
// 2026-01-27T15:00:00-06:00[America/Mexico_City]
// Convertir a otro timezone
const reunionEnMadrid = reunion.withTimeZone('Europe/Madrid');
console.log(reunionEnMadrid.toString());
// 2026-01-27T22:00:00+01:00[Europe/Madrid]
// Obtener hora actual en timezone especifico
const ahoraEnTokyo = Temporal.Now.zonedDateTimeISO('Asia/Tokyo');
console.log(`En Tokyo son ${ahoraEnTokyo.hour}:${ahoraEnTokyo.minute}`);
Trabajando Con Duraciones
Las duraciones tienen representacion propia y operaciones intuitivas.
// Crear duracion
const tiempoDeCarrera = Temporal.Duration.from({
hours: 1,
minutes: 45,
seconds: 30
});
// Operaciones con duracion
const dosCarreras = tiempoDeCarrera.add(tiempoDeCarrera);
console.log(dosCarreras.toString()); // PT3H31M
// Redondear duracion
const redondeado = tiempoDeCarrera.round({
smallestUnit: 'minute',
roundingMode: 'ceil'
});
console.log(redondeado.toString()); // PT1H46M
// Calcular duracion entre dos momentos
const inicio = Temporal.PlainTime.from('09:00');
const fin = Temporal.PlainTime.from('17:30');
const jornada = inicio.until(fin);
console.log(`Jornada: ${jornada.hours}h ${jornada.minutes}min`);Formateo
El formateo esta integrado con Intl.
const fecha = Temporal.PlainDate.from('2026-01-27');
// Formateo con Intl
const formatoES = new Intl.DateTimeFormat('es-ES', {
dateStyle: 'full'
});
console.log(formatoES.format(fecha));
// martes, 27 de enero de 2026
// Formateo personalizado
const formatoCustom = new Intl.DateTimeFormat('es-ES', {
weekday: 'short',
day: 'numeric',
month: 'short'
});
console.log(formatoCustom.format(fecha));
// mar., 27 ene.
Casos de Uso Comunes
Programacion de Eventos
Un caso clasico que Date vuelve complicado.
// Programar evento recurrente
function proximasOcurrencias(inicio, intervalo, cantidad) {
const ocurrencias = [];
let actual = inicio;
for (let i = 0; i < cantidad; i++) {
ocurrencias.push(actual);
actual = actual.add(intervalo);
}
return ocurrencias;
}
const primeraReunion = Temporal.ZonedDateTime.from({
year: 2026,
month: 2,
day: 1,
hour: 10,
minute: 0,
timeZone: 'America/Mexico_City'
});
const reunionesSemanales = proximasOcurrencias(
primeraReunion,
{ weeks: 1 },
4
);
reunionesSemanales.forEach((r, i) => {
console.log(`Reunion ${i + 1}: ${r.toPlainDate().toString()}`);
});
// Reunion 1: 2026-02-01
// Reunion 2: 2026-02-08
// Reunion 3: 2026-02-15
// Reunion 4: 2026-02-22Calculo de Edad
Otro caso que Date vuelve innecesariamente complicado.
function calcularEdad(fechaNacimiento) {
const nacimiento = Temporal.PlainDate.from(fechaNacimiento);
const hoy = Temporal.Now.plainDateISO();
const duracion = nacimiento.until(hoy, {
largestUnit: 'year'
});
return {
anos: duracion.years,
meses: duracion.months,
dias: duracion.days
};
}
const edad = calcularEdad('1990-05-15');
console.log(`${edad.anos} anos, ${edad.meses} meses y ${edad.dias} dias`);
Soporte y Polyfills
Estado de Implementacion
En Enero de 2026, el soporte esta en expansion.
Browsers:
| Browser | Estado |
|---|---|
| Chrome | Disponible (flag hasta v130, por defecto v135+) |
| Firefox | En implementacion |
| Safari | Preview disponible |
| Edge | Sigue a Chrome |
Runtimes:
| Runtime | Estado |
|---|---|
| Node.js | Disponible v23+ |
| Deno | Disponible v2.0+ |
| Bun | Disponible v1.2+ |
Usando Polyfill
Para ambientes sin soporte nativo.
// Instalacion
// npm install @js-temporal/polyfill
// Uso
import { Temporal } from '@js-temporal/polyfill';
// El codigo funciona identico al nativo
const hoy = Temporal.Now.plainDateISO();
console.log(hoy.toString());Conclusion
La Temporal API representa una de las mayores mejoras a JavaScript en anos. Despues de decadas sufriendo con el objeto Date, finalmente tenemos una API de fechas y horas que tiene sentido, es inmutable, y soporta timezones adecuadamente.
Puntos principales:
- Temporal API forma parte de ES2026 y esta llegando a los browsers
- Multiples tipos para diferentes necesidades (Instant, ZonedDateTime, PlainDate, etc.)
- Inmutabilidad por defecto evita bugs comunes
- Timezones funcionan correctamente
- Polyfills disponibles para uso inmediato
Para desarrolladores JavaScript, la recomendacion es: comienza a usar Temporal lo mas rapido posible, sea via polyfill o en ambientes con soporte nativo. Es uno de esos cambios que, una vez adoptados, nunca mas vas a querer volver atras.
Para mas sobre nuevas features de JavaScript, lee: Pattern Matching en JavaScript: La Propuesta TC39 Que Va a Cambiar Tu Codigo.

