Horario de verano explicado: cómo afecta a las marcas de tiempo Unix
El horario de verano adelanta los relojes locales en primavera y los atrasa en otoño. Las marcas de tiempo Unix son inmunes (siempre cuentan UTC), pero cada conversión entre tiempo Unix y hora local debe saber si el horario de verano está activo. Esta guía cubre qué es el DST, dónde se aplica, los bugs de hueco y solapamiento que crea, y cómo manejarlo correctamente.
El DST y el tiempo Unix en un minuto
El horario de verano adelanta los relojes locales una hora en primavera y los atrasa una hora en otoño. Una marca de tiempo Unix nunca se mueve — cuenta segundos UTC y tictaquea de forma recta a través de cada transición — así que es inmune al DST. Lo que cambia es la hora local que muestras para ella. Dos transiciones causan casi todos los bugs de DST: el hueco de primavera, donde una hora de tiempo local nunca sucede, y el solapamiento de otoño, donde una hora sucede dos veces. La tabla siguiente indica cuándo cambian las principales regiones.
| Región | Adelanto (primavera) | Atraso (otoño) | Cambio de reloj |
|---|---|---|---|
| EE. UU. y Canadá | 2.º domingo de marzo | 1.er domingo de noviembre | 02:00 → 03:00 local |
| Unión Europea | Último domingo de marzo | Último domingo de octubre | 01:00 UTC, +1 hora |
| Reino Unido | Último domingo de marzo | Último domingo de octubre | GMT ↔ BST |
| Australia (estados que lo aplican) | 1.er domingo de octubre | 1.er domingo de abril | Hemisferio sur — invertido |
¿Qué es el horario de verano?
El horario de verano (DST) es la práctica de adelantar los relojes locales una hora durante parte del año para prolongar la luz de la tarde. Unos 70 países lo aplican actualmente, sobre todo en latitudes templadas. La transición es una discontinuidad en la hora del reloj de pared, no en UTC — las marcas de tiempo Unix siguen tictaqueando sin sobresaltos a través de cada adelanto y atraso.
- Hemisferio norte: los relojes suelen adelantarse en marzo y atrasarse en octubre/noviembre
- Hemisferio sur: los relojes se adelantan en octubre y se atrasan en marzo/abril
- Las regiones tropicales y ecuatoriales generalmente no aplican el DST
- El DST añade una hora de luz a la tarde pero no cambia la cantidad total de luz diurna
Cómo las transiciones de DST afectan a las marcas de tiempo Unix
Una marca de tiempo Unix es el número de segundos transcurridos desde 1970 UTC, así que no puede saltar adelante ni repetirse. Lo que cambia es la interpretación en hora local de esos segundos. En un adelanto de primavera, el reloj local salta de 02:00 a 03:00 — la hora de reloj de pared de 02:00 a 02:59 nunca ocurre localmente. En el atraso, el reloj local de 01:00 a 01:59 ocurre dos veces, con una hora de diferencia en UTC.
- Ninguna marca de tiempo Unix es jamás saltada ni duplicada por el DST
- Una marca de tiempo Unix dada corresponde a una hora local concreta, desfase incluido (PDT vs PST, BST vs GMT, etc.)
- Una hora local dada puede corresponder a cero (hueco de DST) o dos (solapamiento de DST) marcas de tiempo Unix
- Usa nombres IANA (America/Los_Angeles) para que el DST se aplique por ti; nunca codifiques a mano un desfase como UTC−8 si el lugar aplica DST
El hueco y el solapamiento de DST explicados
Las dos transiciones crean los dos bugs clásicos de DST. El hueco de primavera es la fuente más común de fallos de programación y recordatorios — un evento fijado a las 02:30 el día de la transición no existirá localmente. El solapamiento de otoño es el más sutil — un evento a las 01:30 el día de la transición existe dos veces, con una hora de diferencia. Cada caso requiere una política explícita.
| Transición | El reloj hace | Efecto en la hora local |
|---|---|---|
| Adelanto (primavera) | 02:00 → 03:00 | 02:00–02:59 nunca existe (el "hueco") |
| Atraso (otoño) | 02:00 → 01:00 | 01:00–01:59 ocurre dos veces (el "solapamiento") |
- Hueco: ISO 8601 / RFC 3339 no puede representar sin ambigüedad una hora dentro del hueco
- Solapamiento: anota qué ocurrencia con un desfase explícito (UTC−5 vs UTC−4)
- Python: zoneinfo maneja hueco/solapamiento vía el atributo fold (0 = primera ocurrencia, 1 = segunda)
- JavaScript Temporal: ZonedDateTime toma una opción de desambiguación ("earlier", "later", "compatible", "reject")
- Un cron a las 02:30 en una zona con DST se salta en el adelanto o se dispara dos veces en el atraso — programa en UTC si es posible
Qué regiones aplican el DST
La adopción del DST es un mosaico y cambia con regularidad — consulta siempre los tzdata IANA actuales en lugar de codificar una regla a mano. Lo siguiente es ampliamente correcto para 2026.
- Estados Unidos: la mayoría de los estados aplican el DST (marzo–noviembre). Arizona (salvo la Nación Navajo) y Hawái no
- Canadá: la mayoría de las provincias aplican el DST. Saskatchewan, la mayor parte del Yukón y (desde 2026) la mayor parte de la Columbia Británica no
- Unión Europea: aplica el DST (último domingo de marzo → último domingo de octubre). Una votación de 2019 para abolirlo se ha aplazado
- Reino Unido: aplica el DST como BST (UTC+1) en verano
- México: abolió el DST nacional en 2022; solo los municipios fronterizos alineados con EE. UU. lo siguen aplicando
- Australia: solo NSW, Victoria, Tasmania, ACT y Australia Meridional aplican el DST (octubre–abril)
- La mayor parte de Asia, África y Sudamérica: sin DST
Manejar el DST con seguridad en el código
El enfoque fiable es anclar todo en marcas de tiempo Unix (o fechas-hora con zona IANA) y tratar la hora local como un asunto de presentación.
- Almacenar: segundos epoch Unix o un datetime con conciencia de zona (p. ej. TIMESTAMPTZ en Postgres)
- Calcular: en UTC o en bibliotecas de fecha-hora con conciencia de IANA (Temporal, zoneinfo, java.time)
- Mostrar: convertir a la zona IANA del usuario en el momento del renderizado
- Programar: almacenar la zona IANA junto a la hora de pared local para eventos recurrentes que deben permanecer a las "9 de la mañana local"
- Nunca almacenes la abreviatura EDT/PDT/CET como sustituto del nombre IANA
El impulso para abolir el DST
Varias legislaturas han votado abolir los cambios de hora semestrales; pocas de esas votaciones han llevado a cambios reales de política. Actividad reciente destacable:
- 2022: el Senado de EE. UU. aprobó por unanimidad la Sunshine Protection Act, que se estancó en la Cámara
- 2022: México abolió el DST nacional
- 2024: Trump se opuso públicamente al DST permanente; el impulso en el Senado se ralentizó
- 2026: la Columbia Británica pasó a UTC−7 permanente; el Comité de Energía y Comercio de la Cámara de EE. UU. impulsó un nuevo texto de abolición del DST
- 2019: la UE votó en principio abolir el DST pero ha retrasado repetidamente su aplicación
Referencias relacionadas
FAQ
- ¿El DST afecta a las marcas de tiempo Unix?
- No. Las marcas de tiempo Unix cuentan segundos UTC desde 1970 y continúan sin sobresaltos a través de cada transición de DST. Solo cambia la interpretación en hora local de esos segundos.
- ¿Qué es una hora ambigua?
- Una hora ambigua es una hora local que corresponde a dos instantes UTC distintos. Ocurre en el atraso de otoño, cuando el reloj retrocede de 02:00 a 01:00 y la hora 01:00–01:59 sucede dos veces. Desambigua con un desfase explícito o la opción fold / de desambiguación de una biblioteca.
- ¿Qué les pasa a las tareas programadas en la transición de DST?
- Una tarea cron en una zona con DST programada a las 02:30 se saltará (adelanto) o se ejecutará dos veces (atraso). La solución es programar en UTC o usar un planificador que desambigüe explícitamente.
- ¿En el código se usa "EST" o "America/New_York"?
- America/New_York. El nombre IANA aplica automáticamente EST (UTC−5) en invierno y EDT (UTC−4) en verano. Codificar "EST" a mano significa que los valores son erróneos la mitad del año.
- ¿Cómo manejo el DST correctamente en el código?
- Almacena y calcula en UTC (o con fechas-hora con zona IANA) y convierte a hora local solo para mostrar. Usa nombres de zona IANA como America/New_York, nunca desfases fijos ni abreviaturas como EST, para que el DST se aplique por ti.
- ¿Cuándo empieza y termina el DST en 2026?
- En EE. UU., el DST empieza a las 02:00 local el 8 de marzo de 2026 (adelanto a 03:00) y termina a las 02:00 local el 1 de noviembre de 2026 (atraso a 01:00). En la UE, las transiciones son el 29 de marzo y el 25 de octubre de 2026.