Horário de verão explicado: como o DST afeta os timestamps Unix
O horário de verão adianta os relógios locais na primavera e atrasa-os no outono. Os timestamps Unix são imunes (contam sempre UTC), mas cada conversão entre tempo Unix e hora local tem de saber se o horário de verão está ativo. Este guia explica o que é o DST, onde se aplica, os bugs de buraco e sobreposição que cria, e como lidar com ele corretamente.
O DST e o tempo Unix num minuto
O horário de verão adianta os relógios locais uma hora na primavera e atrasa-os uma hora no outono. Um timestamp Unix nunca se move — conta segundos UTC e avança a direito através de cada transição — por isso é imune ao DST. O que muda é a hora local que mostras para ele. Duas transições causam quase todos os bugs de DST: o buraco da primavera, em que uma hora de tempo local nunca acontece, e a sobreposição do outono, em que uma hora acontece duas vezes. A tabela abaixo indica quando as principais regiões mudam.
| Região | Adianto (primavera) | Atraso (outono) | Mudança de relógio |
|---|---|---|---|
| EUA e Canadá | 2.º domingo de março | 1.º domingo de novembro | 02:00 → 03:00 local |
| União Europeia | Último domingo de março | Último domingo de outubro | 01:00 UTC, +1 hora |
| Reino Unido | Último domingo de março | Último domingo de outubro | GMT ↔ BST |
| Austrália (estados que o aplicam) | 1.º domingo de outubro | 1.º domingo de abril | Hemisfério sul — invertido |
O que é o horário de verão?
O horário de verão (DST) é a prática de adiantar os relógios locais uma hora durante parte do ano para prolongar a luz da tarde. Cerca de 70 países aplicam-no atualmente, sobretudo em latitudes temperadas. A transição é uma descontinuidade na hora do relógio de parede, não em UTC — os timestamps Unix continuam a avançar sem solavancos através de cada adianto e atraso.
- Hemisfério norte: os relógios costumam adiantar em março e atrasar em outubro/novembro
- Hemisfério sul: os relógios adiantam em outubro e atrasam em março/abril
- As regiões tropicais e equatoriais geralmente não aplicam o DST
- O DST acrescenta uma hora de luz à tarde mas não altera a quantidade total de luz do dia
Como as transições de DST afetam os timestamps Unix
Um timestamp Unix é o número de segundos decorridos desde 1970 UTC, por isso não pode saltar à frente nem repetir-se. O que muda é a interpretação em hora local desses segundos. Num adianto da primavera, o relógio local salta de 02:00 para 03:00 — a hora de relógio de parede de 02:00 a 02:59 nunca ocorre localmente. No atraso, o relógio local de 01:00 a 01:59 ocorre duas vezes, com uma hora de intervalo em UTC.
- Nenhum timestamp Unix é alguma vez saltado ou duplicado pelo DST
- Um dado timestamp Unix corresponde a uma hora local específica, incluindo o deslocamento (PDT vs PST, BST vs GMT, etc.)
- Uma dada hora local pode corresponder a zero (buraco de DST) ou dois (sobreposição de DST) timestamps Unix
- Usa nomes IANA (America/Los_Angeles) para que o DST seja aplicado por ti; nunca codifiques à mão um deslocamento como UTC−8 se o local aplica DST
O buraco e a sobreposição de DST explicados
As duas transições criam os dois bugs clássicos de DST. O buraco da primavera é a fonte mais comum de falhas de agendamento e lembretes — um evento marcado para as 02:30 no dia da transição não existirá localmente. A sobreposição do outono é a mais subtil — um evento às 01:30 no dia da transição existe duas vezes, com uma hora de intervalo. Cada caso exige uma política explícita.
| Transição | O relógio faz | Efeito na hora local |
|---|---|---|
| Adianto (primavera) | 02:00 → 03:00 | 02:00–02:59 nunca existe (o "buraco") |
| Atraso (outono) | 02:00 → 01:00 | 01:00–01:59 ocorre duas vezes (a "sobreposição") |
- Buraco: ISO 8601 / RFC 3339 não consegue representar sem ambiguidade uma hora dentro do buraco
- Sobreposição: anota qual ocorrência com um deslocamento explícito (UTC−5 vs UTC−4)
- Python: o zoneinfo trata buraco/sobreposição via o atributo fold (0 = primeira ocorrência, 1 = segunda)
- JavaScript Temporal: ZonedDateTime aceita uma opção de desambiguação ("earlier", "later", "compatible", "reject")
- Um cron às 02:30 numa zona com DST salta no adianto ou dispara duas vezes no atraso — agenda em UTC se possível
Que regiões aplicam o DST
A adoção do DST é um mosaico e muda com regularidade — consulta sempre os tzdata IANA atuais em vez de codificar uma regra à mão. O seguinte é amplamente correto para 2026.
- Estados Unidos: a maioria dos estados aplica o DST (março–novembro). O Arizona (exceto a Nação Navajo) e o Havai não
- Canadá: a maioria das províncias aplica o DST. Saskatchewan, a maior parte do Yukon e (desde 2026) a maior parte da Colúmbia Britânica não
- União Europeia: aplica o DST (último domingo de março → último domingo de outubro). Uma votação de 2019 para o abolir foi adiada
- Reino Unido: aplica o DST como BST (UTC+1) no verão
- México: aboliu o DST nacional em 2022; só os municípios fronteiriços alinhados com os EUA o continuam a aplicar
- Austrália: só NSW, Vitória, Tasmânia, ACT e Austrália Meridional aplicam o DST (outubro–abril)
- A maior parte da Ásia, África e América do Sul: sem DST
Lidar com o DST em segurança no código
A abordagem fiável é ancorar tudo em timestamps Unix (ou datas-hora com fuso IANA) e tratar a hora local como uma questão de apresentação.
- Armazenar: segundos epoch Unix ou um datetime ciente do fuso (p. ex. TIMESTAMPTZ no Postgres)
- Calcular: em UTC ou em bibliotecas de data-hora cientes do IANA (Temporal, zoneinfo, java.time)
- Apresentar: converter para o fuso IANA do utilizador no momento da renderização
- Agendar: armazenar o fuso IANA ao lado da hora de parede local para eventos recorrentes que devem ficar às "9 da manhã locais"
- Nunca armazenes a abreviatura EDT/PDT/CET como substituto do nome IANA
O impulso para abolir o DST
Vários parlamentos votaram pela abolição das mudanças de hora semestrais; poucas dessas votações levaram a mudanças reais de política. Atividade recente notável:
- 2022: o Senado dos EUA aprovou por unanimidade a Sunshine Protection Act, que estagnou na Câmara
- 2022: o México aboliu o DST nacional
- 2024: Trump opôs-se publicamente ao DST permanente; o ímpeto no Senado abrandou
- 2026: a Colúmbia Britânica passou a UTC−7 permanente; a Comissão de Energia e Comércio da Câmara dos EUA fez avançar um novo texto de abolição do DST
- 2019: a UE votou em princípio abolir o DST mas adiou repetidamente a aplicação
Referências relacionadas
FAQ
- O DST afeta os timestamps Unix?
- Não. Os timestamps Unix contam segundos UTC desde 1970 e continuam sem solavancos através de cada transição de DST. Só muda a interpretação em hora local desses segundos.
- O que é uma hora ambígua?
- Uma hora ambígua é uma hora local que corresponde a dois instantes UTC diferentes. Acontece no atraso do outono, quando o relógio recua de 02:00 para 01:00 e a hora 01:00–01:59 ocorre duas vezes. Desambigua com um deslocamento explícito ou a opção fold / de desambiguação de uma biblioteca.
- O que acontece às tarefas agendadas na transição de DST?
- Uma tarefa cron numa zona com DST agendada para as 02:30 será saltada (adianto) ou executada duas vezes (atraso). A solução é agendar em UTC ou usar um agendador que desambigue explicitamente.
- No código usa-se "EST" ou "America/New_York"?
- America/New_York. O nome IANA aplica automaticamente EST (UTC−5) no inverno e EDT (UTC−4) no verão. Codificar "EST" à mão significa que os valores estão errados metade do ano.
- Como lido corretamente com o DST no código?
- Armazena e calcula em UTC (ou com datas-hora com fuso IANA) e converte para hora local apenas para apresentação. Usa nomes de fuso IANA como America/New_York, nunca deslocamentos fixos nem abreviaturas como EST, para que o DST seja aplicado por ti.
- Quando começa e termina o DST em 2026?
- Nos EUA, o DST começa às 02:00 locais a 8 de março de 2026 (adianto para 03:00) e termina às 02:00 locais a 1 de novembro de 2026 (atraso para 01:00). Na UE, as transições são a 29 de março e 25 de outubro de 2026.