Ora legale spiegata: come il DST influisce sui timestamp Unix
L'ora legale sposta avanti gli orologi locali in primavera e indietro in autunno. I timestamp Unix sono immuni (contano sempre UTC), ma ogni conversione tra tempo Unix e ora locale deve sapere se l'ora legale è attiva. Questa guida spiega cos'è il DST, dove si applica, i bug di buco e sovrapposizione che crea, e come gestirlo correttamente.
Il DST e il tempo Unix in un minuto
L'ora legale sposta gli orologi locali un'ora avanti in primavera e un'ora indietro in autunno. Un timestamp Unix non si muove mai — conta i secondi UTC e ticchetta dritto attraverso ogni transizione — quindi è immune al DST. Ciò che cambia è l'ora locale che visualizzi per esso. Due transizioni causano quasi tutti i bug di DST: il buco della primavera, in cui un'ora di tempo locale non accade mai, e la sovrapposizione dell'autunno, in cui un'ora accade due volte. La tabella sotto indica quando cambiano le principali regioni.
| Regione | Passaggio all'ora legale | Ritorno all'ora solare | Cambio dell'orologio |
|---|---|---|---|
| USA e Canada | 2ª domenica di marzo | 1ª domenica di novembre | 02:00 → 03:00 locale |
| Unione Europea | Ultima domenica di marzo | Ultima domenica di ottobre | 01:00 UTC, +1 ora |
| Regno Unito | Ultima domenica di marzo | Ultima domenica di ottobre | GMT ↔ BST |
| Australia (stati che la applicano) | 1ª domenica di ottobre | 1ª domenica di aprile | Emisfero sud — invertito |
Cos'è l'ora legale?
L'ora legale (DST) è la pratica di spostare avanti gli orologi locali di un'ora durante parte dell'anno per prolungare la luce serale. Circa 70 paesi la applicano attualmente, perlopiù alle latitudini temperate. La transizione è una discontinuità nell'ora dell'orologio da parete, non in UTC — i timestamp Unix continuano a ticchettare senza scosse attraverso ogni passaggio e ritorno.
- Emisfero nord: gli orologi di solito vanno avanti a marzo e indietro a ottobre/novembre
- Emisfero sud: gli orologi vanno avanti a ottobre e indietro a marzo/aprile
- Le regioni tropicali ed equatoriali generalmente non applicano il DST
- Il DST aggiunge un'ora di luce alla sera ma non cambia la quantità totale di luce diurna
Come le transizioni di DST influiscono sui timestamp Unix
Un timestamp Unix è il numero di secondi trascorsi dal 1970 UTC, quindi non può saltare avanti né ripetersi. Ciò che cambia è l'interpretazione in ora locale di quei secondi. A un passaggio all'ora legale, l'orologio locale salta da 02:00 a 03:00 — l'ora da parete dalle 02:00 alle 02:59 non accade mai localmente. Al ritorno all'ora solare, l'orologio locale dalle 01:00 alle 01:59 accade due volte, con un'ora di scarto in UTC.
- Nessun timestamp Unix viene mai saltato o duplicato dal DST
- Un dato timestamp Unix corrisponde a un'ora locale precisa, offset incluso (PDT vs PST, BST vs GMT, ecc.)
- Una data ora locale può corrispondere a zero (buco DST) o due (sovrapposizione DST) timestamp Unix
- Usa i nomi IANA (America/Los_Angeles) così il DST viene applicato per te; non codificare mai a mano un offset come UTC−8 se il luogo applica il DST
Il buco e la sovrapposizione di DST spiegati
Le due transizioni creano i due bug classici del DST. Il buco della primavera è la fonte più comune di fallimenti di pianificazione e promemoria — un evento fissato alle 02:30 nel giorno della transizione non esisterà localmente. La sovrapposizione dell'autunno è la più sottile — un evento alle 01:30 nel giorno della transizione esiste due volte, a un'ora di distanza. Ogni caso richiede una politica esplicita.
| Transizione | L'orologio fa | Effetto sull'ora locale |
|---|---|---|
| Passaggio all'ora legale | 02:00 → 03:00 | 02:00–02:59 non esiste mai (il "buco") |
| Ritorno all'ora solare | 02:00 → 01:00 | 01:00–01:59 si verifica due volte (la "sovrapposizione") |
- Buco: ISO 8601 / RFC 3339 non può rappresentare senza ambiguità un'ora dentro il buco
- Sovrapposizione: annota quale occorrenza con un offset esplicito (UTC−5 vs UTC−4)
- Python: zoneinfo gestisce buco/sovrapposizione tramite l'attributo fold (0 = prima occorrenza, 1 = seconda)
- JavaScript Temporal: ZonedDateTime accetta un'opzione di disambiguazione ("earlier", "later", "compatible", "reject")
- Un cron alle 02:30 in un fuso con DST salta al passaggio o scatta due volte al ritorno — pianifica in UTC se possibile
Quali regioni applicano il DST
L'adozione del DST è a macchia di leopardo e cambia regolarmente — consulta sempre i tzdata IANA attuali invece di codificare una regola a mano. Quanto segue è ampiamente corretto per il 2026.
- Stati Uniti: la maggior parte degli stati applica il DST (marzo–novembre). L'Arizona (tranne la Navajo Nation) e le Hawaii no
- Canada: la maggior parte delle province applica il DST. Saskatchewan, gran parte dello Yukon e (dal 2026) gran parte della Columbia Britannica no
- Unione Europea: applica il DST (ultima domenica di marzo → ultima domenica di ottobre). Un voto del 2019 per abolirlo è stato rinviato
- Regno Unito: applica il DST come BST (UTC+1) in estate
- Messico: ha abolito il DST nazionale nel 2022; solo i comuni di confine allineati agli USA lo applicano ancora
- Australia: solo NSW, Victoria, Tasmania, ACT e Australia Meridionale applicano il DST (ottobre–aprile)
- Gran parte di Asia, Africa e Sud America: nessun DST
Gestire il DST in sicurezza nel codice
L'approccio affidabile è ancorare tutto su timestamp Unix (o date-ora con fuso IANA) e trattare l'ora locale come una questione di presentazione.
- Memorizzare: secondi epoch Unix o un datetime consapevole del fuso (es. TIMESTAMPTZ in Postgres)
- Calcolare: in UTC o in librerie di data-ora consapevoli di IANA (Temporal, zoneinfo, java.time)
- Visualizzare: convertire nel fuso IANA dell'utente al momento del rendering
- Pianificare: memorizzare il fuso IANA accanto all'ora da parete locale per eventi ricorrenti che devono restare alle "9 del mattino locali"
- Non memorizzare mai l'abbreviazione EDT/PDT/CET come sostituto del nome IANA
La spinta per abolire il DST
Diversi parlamenti hanno votato per abolire i cambi d'ora semestrali; pochi di quei voti hanno portato a reali cambiamenti di politica. Attività recente di rilievo:
- 2022: il Senato USA ha approvato all'unanimità il Sunshine Protection Act, che si è arenato alla Camera
- 2022: il Messico ha abolito il DST nazionale
- 2024: Trump si è opposto pubblicamente al DST permanente; lo slancio al Senato è rallentato
- 2026: la Columbia Britannica è passata a UTC−7 permanente; la Commissione Energia e Commercio della Camera USA ha fatto avanzare un nuovo testo di abolizione del DST
- 2019: l'UE ha votato in linea di principio per abolire il DST ma ne ha ripetutamente rinviato l'attuazione
Riferimenti correlati
FAQ
- Il DST influisce sui timestamp Unix?
- No. I timestamp Unix contano i secondi UTC dal 1970 e proseguono senza scosse attraverso ogni transizione di DST. Cambia solo l'interpretazione in ora locale di quei secondi.
- Cos'è un'ora ambigua?
- Un'ora ambigua è un'ora locale che corrisponde a due istanti UTC diversi. Accade al ritorno all'ora solare, quando l'orologio torna da 02:00 a 01:00 e l'ora 01:00–01:59 si verifica due volte. Disambigua con un offset esplicito o l'opzione fold / di disambiguazione di una libreria.
- Cosa succede ai job pianificati alla transizione di DST?
- Un job cron in un fuso con DST pianificato alle 02:30 verrà saltato (passaggio all'ora legale) o eseguito due volte (ritorno all'ora solare). La soluzione è pianificare in UTC o usare uno scheduler che disambigua esplicitamente.
- Nel codice si usa "EST" o "America/New_York"?
- America/New_York. Il nome IANA applica automaticamente EST (UTC−5) in inverno e EDT (UTC−4) in estate. Codificare "EST" a mano significa che i valori sono sbagliati per metà anno.
- Come gestisco correttamente il DST nel codice?
- Memorizza e calcola in UTC (o con date-ora con fuso IANA) e converti in ora locale solo per la visualizzazione. Usa nomi di fuso IANA come America/New_York, mai offset fissi o abbreviazioni come EST, così il DST viene applicato per te.
- Quando iniziano e finiscono il DST nel 2026?
- Negli USA il DST inizia alle 02:00 locali l'8 marzo 2026 (avanti alle 03:00) e finisce alle 02:00 locali il 1° novembre 2026 (indietro all'01:00). Nell'UE le transizioni sono il 29 marzo e il 25 ottobre 2026.