APIs de la web, hoyLaboratorio · Alex Harto

Temporal

Fechas y horas que por fin funcionan: inmutables, con zonas horarias y calendarios.

En tu navegador: comprobando…Revisado 1 oct 2026

Temporal sustituye a Date con un tipo para cada caso: PlainDate (una fecha), PlainTime, ZonedDateTime (un instante en una zona), Instant y Duration. Cada operación devuelve un objeto nuevo y los cambios de hora se calculan bien.

Es estándar desde marzo de 2026 (etapa 4 de TC39). Está en Firefox desde la 139 y en Chrome y Edge desde la 144; Safari solo lo tiene en Technology Preview. Mientras tanto, temporal-polyfill lo completa.

Para qué sirve

  • Calendarios y reservas entre zonas horarias
  • Cuentas atrás y duraciones exactas
  • Fechas sin hora que no se corren un día

Demo

…

Una reunión, en ocho zonas

Donde Date falla

Compatibilidad

Disponibilidad limitada
FunciónEscritorioMóvil
ChromeEdgeFirefoxSafariChrome AndroidFirefox AndroidSafari iOS
Temporal144Chrome: 144 144Edge: 144 139Firefox: 139 ✓previewSafari: preview144Chrome: 144 139Firefox: 139 —Safari: No

Compatibilidad generada en cada publicación desde MDN browser-compat-data 8.1.3 (24 sep 2026) · web-features 3.40.0 · revisión manual: 1 oct 2026

Código mínimo

<!doctype html>
<meta charset="utf-8">
<title>Temporal · ejemplo mínimo</title>
<!-- Fechas inmutables con zona horaria. Chrome 144+, Firefox 139+; en Safari, polyfill. -->
<pre id="out"></pre>
<script type="module">
// Usa el Temporal nativo si existe; si no, carga el polyfill
if (typeof Temporal === 'undefined') await import('https://cdn.jsdelivr.net/npm/temporal-polyfill@1.0.5/global.esm.js');

const today = Temporal.Now.plainDateISO();
let christmas = Temporal.PlainDate.from({ year: today.year, month: 12, day: 25 });
if (Temporal.PlainDate.compare(christmas, today) < 0) christmas = christmas.add({ years: 1 });

// 25 oct 2026, 01:30 en Madrid: esa noche se atrasa la hora a las 03:00
const meeting = Temporal.ZonedDateTime.from('2026-10-25T01:30[Europe/Madrid]');
const later = meeting.add({ hours: 2 }); // dos horas reales, con el cambio de hora incluido

document.querySelector('#out').textContent = [
  `Hoy: ${today}`,
  `Días hasta Navidad: ${today.until(christmas).days}`,
  `Reunión: ${meeting}`,
  `Dos horas después: ${later}`,
  `En Nueva York: ${meeting.withTimeZone('America/New_York').toPlainDateTime()}`,
  `1 h 30 min = ${Temporal.Duration.from({ hours: 1, minutes: 30 }).total('minutes')} min`,
].join('\n');
</script>

Novedades

  1. Safari Technology Preview 249 incorpora el objeto Temporal.
  2. Temporal alcanza la etapa 4 de TC39.
  3. Chrome 144 lo activa.

Ten en cuenta

  1. Elige bien el tipo: PlainDate para cumpleaños, ZonedDateTime para citas, Instant para registros.
  2. Con temporal-polyfill (1.0.5), import 'temporal-polyfill/global' solo actúa si falta el nativo; para calendarios no gregorianos, importa /full.
  3. Para pasar de Date: date.toTemporalInstant().

Más información

Fuentes