Temporal
Fechas y horas que por fin funcionan: inmutables, con zonas horarias y calendarios.
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ón | Escritorio | Móvil | |||||
|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Safari | Chrome Android | Firefox Android | Safari iOS | |
| Temporal | 144Chrome: 144 | 144Edge: 144 | 139Firefox: 139 | ✓previewSafari: preview | 144Chrome: 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><!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>Abrir el ejemplo ↗apis-snippets/temporal/ · Los repositorios se publicarán pronto.
Novedades
Ten en cuenta
- Elige bien el tipo: PlainDate para cumpleaños, ZonedDateTime para citas, Instant para registros.
- Con temporal-polyfill (1.0.5), import 'temporal-polyfill/global' solo actúa si falta el nativo; para calendarios no gregorianos, importa /full.
- Para pasar de Date: date.toTemporalInstant().
Más información
Fuentes
- Igalia · Temporal reaches Stage 413 mar 2026
- Safari Technology Preview 24929 jul 2026
- MDN browser-compat-data 8.1.324 sep 2026
- npm · temporal-polyfill 1.0.511 sep 2026