Volver al blog

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-22

Calculo 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:

  1. Temporal API forma parte de ES2026 y esta llegando a los browsers
  2. Multiples tipos para diferentes necesidades (Instant, ZonedDateTime, PlainDate, etc.)
  3. Inmutabilidad por defecto evita bugs comunes
  4. Timezones funcionan correctamente
  5. 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.

Vamos con todo! 🦅

Comentarios (0)

Este artículo aún no tiene comentarios 😢. ¡Sé el primero! 🚀🦅

Añadir comentarios