Panoramica sui fusi orari

La classe TimeZoneInfo semplifica la creazione di applicazioni che rilevano il fuso orario. La classe TimeZone supporta l'uso del fuso orario locale e dell'ora UTC (Coordinated Universal Time). La classe TimeZoneInfo supporta entrambe queste zone e qualsiasi fuso orario relativo alle informazioni predefinite nel Registro di sistema. È anche possibile usare TimeZoneInfo per definire fusi orari personalizzati le cui informazioni non sono presenti nel sistema.

Informazioni essenziali sui fusi orari

Un fuso orario è un'area geografica nella quale si usa la stessa ora. In genere, ma non sempre, i fusi orari adiacenti hanno un'ora di differenza. L'ora in un qualsiasi fuso orario del mondo può essere espressa come scostamento rispetto all'ora Coordinated Universal Time (UTC).

Molti fusi orari del mondo supportano l'ora legale. L'ora legale ha lo scopo di massimizzare le ore di luce diurna, con uno spostamento in avanti di un'ora in primavera o a inizio estate e con il ripristino dell'ora normale o solare a fine estate o inizio autunno. Queste modifiche rispetto all'ora solare sono note come regole di rettifica.

La transizione alla e dall'ora legale in un determinato fuso orario può essere definita da una regola di rettifica fissa o mobile. Una regola di rettifica fissa imposta una determinata data in cui si verifica ogni anno la transizione alla o dall'ora legale. Ad esempio, una transizione dall'ora legale all'ora solare che si verifica ogni anno il 25 ottobre segue una regola di rettifica fissa. Le regole di rettifica mobili, molto più comuni, impostano un determinato giorno di una determinata settimana di un determinato mese per la transizione alla o dall'ora legale. Ad esempio, una transizione dall'ora solare all'ora legale che si verifica la terza domenica del mese di marzo segue una regola di rettifica mobile.

Per i fusi orari che supportano le regole di rettifica, la transizione alla e dall'ora legale crea due tipi di ore anomale: le ore non valide e le ore ambigue. Un'ora non valida è un'ora inesistente creata dalla transizione dall'ora solare all'ora legale. Ad esempio, se questa transizione si verifica in un determinato giorno alle 2:00 e fa sì che l'ora venga modificata alle 3:00, ogni intervallo di tempo compreso tra le 2:00 e le 2:59:59:59 non sarà valido. Un'ora ambigua è un'ora che può essere mappata su due ore diverse in un singolo fuso orario. Viene creata con la transizione dall'ora legale all'ora solare. Ad esempio, se questa transizione si verifica in un determinato giorno alle 2:00 e fa sì che l'ora venga modificata alla 1:00, ogni intervallo di tempo compreso tra la 1:00 e le 1:59:59.59 può essere interpretato come ora solare o ora legale.

Terminologia dei fusi orari

Nella tabella seguente sono definiti termini usati comunemente quando si lavora con i fusi orari e si sviluppano applicazioni che rilevano il fuso orario.

Termine Definizione
Regola di rettifica Regola che definisce quando si verifica la transizione dall'ora solare all'ora legale e viceversa. Ogni regola di rettifica ha una data di inizio e una data di fine che definiscono quando la regola è attiva (ad esempio la regola può essere attiva dal 1° gennaio 1986 al 31 dicembre 2006), un valore delta (la variazione oraria risultante dall'applicazione della regola di rettifica) e informazioni sulla data e ora specifica in cui le transizioni avranno luogo durante il periodo di rettifica. Le transizioni possono seguire una regola fissa o una regola mobile.
Ora ambigua Ora che può essere mappata su due ore diverse in un singolo fuso orario. Si verifica quando l'orologio viene riportato indietro, ad esempio durante la transizione dall'ora legale all'ora solare di un determinato fuso orario. Ad esempio, se questa transizione si verifica in un determinato giorno alle 2:00 e fa sì che l'ora venga modificata alla 1:00, ogni intervallo di tempo compreso tra la 1:00 e le 1:59:59.59 può essere interpretato come ora solare o ora legale.
Regola fissa Regola di rettifica che imposta una determinata data per la transizione alla o dall'ora legale. Ad esempio, una transizione dall'ora legale all'ora solare che si verifica ogni anno il 25 ottobre segue una regola di rettifica fissa.
Regola mobile Regola di rettifica che imposta un determinato giorno di una determinata settimana di un determinato mese per la transizione alla o dall'ora legale. Ad esempio, una transizione dall'ora solare all'ora legale che si verifica la terza domenica del mese di marzo segue una regola di rettifica mobile.
Ora non valida Ora inesistente creata dalla transizione dall'ora solare all'ora legale. Si verifica quando l'orologio viene portato avanti, ad esempio durante la transizione dall'ora solare all'ora legale di un determinato fuso orario. Ad esempio, se questa transizione si verifica in un determinato giorno alle 2:00 e fa sì che l'ora venga modificata alle 3:00, ogni intervallo di tempo compreso tra le 2:00 e le 2:59:59:59 non sarà valido.
Ora transizione Informazioni su una modifica di ora specifica, ad esempio la modifica dall'ora legale all'ora solare o viceversa, in un particolare fuso orario.

Fusi orari e classe TimeZoneInfo

In .NET un oggetto TimeZoneInfo rappresenta un fuso orario. La classe TimeZoneInfo include un metodo GetAdjustmentRules che restituisce una matrice di oggetti TimeZoneInfo.AdjustmentRule. Ogni elemento di questa matrice fornisce informazioni sulla transizione da e verso l'ora legale per un determinato periodo di tempo. Per i fusi orari che non supportano l'ora legale, il metodo restituisce una matrice vuota. Ogni oggetto TimeZoneInfo.AdjustmentRule ha un DaylightTransitionStart e una proprietà DaylightTransitionEnd che definisce la data e l'ora della transizione da e verso l'ora legale. La proprietà IsFixedDateRule indica se la transizione è fissa o mobile.

.NET si basa sulle informazioni sul fuso orario fornite dal sistema operativo Windows e archiviate nel Registro di sistema. A causa dei vari fusi orari del pianeta, non tutti quelli esistenti sono rappresentati nel Registro di sistema. Inoltre, poiché il Registro di sistema è una struttura dinamica, è possibile aggiungere o rimuovere fusi orari predefiniti da esso. Infine, il registro non contiene necessariamente dati cronologici del fuso orario. Ad esempio, in Windows XP il Registro di sistema contiene dati relativi solo a un singolo set di regolazioni del fuso orario. Windows Vista supporta i dati dinamici del fuso orario, il che significa che un singolo fuso orario può avere più regole di rettifica applicabili a intervalli specifici di anni. Tuttavia, la maggior parte dei fusi orari definiti nel Registro di sistema di Windows Vista e che supporta l'ora legale ha solo una o due regole di rettifica predefinite.

La dipendenza della classe TimeZoneInfo nel Registro di sistema indica che un'applicazione con riconoscimento del fuso orario non può essere certa che un particolare fuso orario sia definito nel Registro di sistema. Di conseguenza, se si prevede di creare un'istanza di un fuso orario specifico (diverso dal fuso orario locale o da quello che rappresenta l'ora UTC) è consigliabile usare la gestione delle eccezioni. Il codice dovrà anche includere un metodo che consenta all'applicazione di continuare l'esecuzione se non è possibile creare un'istanza dell'oggetto TimeZoneInfo necessario dal registro.

Per gestire l'assenza di un fuso orario necessario, la classe TimeZoneInfo include un metodo CreateCustomTimeZone, che è possibile usare per creare fusi orari personalizzati non trovati nel Registro di sistema. Per informazioni dettagliate sulla creazione di un fuso orario personalizzato, vedere Procedura: Creare fusi orari senza regole di rettifica e Procedura: Creare fusi orari con regole di rettifica. È anche possibile usare il metodo ToSerializedString per convertire un fuso orario appena creato in una stringa e salvarlo in un archivio dati, ad esempio un database, un file di testo, il Registro di sistema o una risorsa dell'applicazione. È quindi possibile utilizzare il metodo FromSerializedString per convertire nuovamente questa stringa in un oggetto TimeZoneInfo. Per informazioni dettagliate, vedere Procedura: Salvare fusi orari in una risorsa incorporata e Procedura: Ripristinare fusi orari da una risorsa incorporata.

Dato che ogni fuso orario è caratterizzato da un offset di base rispetto al fuso orario UTC, nonché da un offset da UTC che riflette eventuali regole di rettifica, un'ora in un fuso orario può essere convertita facilmente nell'ora corrispondente in un altro fuso orario. A questo scopo, l'oggetto TimeZoneInfo include diversi metodi di conversione, tra cui:

  • ConvertTimeFromUtc, che converte l'ora UTC nell'ora in un fuso orario designato.

  • ConvertTimeToUtc, che converte l'ora in un fuso orario designato in UTC.

  • ConvertTime, che converte l'ora in un fuso orario designato nell'ora in un altro fuso orario designato.

  • ConvertTimeBySystemTimeZoneId, che usa gli identificatori del fuso orario (anziché gli oggetti TimeZoneInfo) come parametri per convertire l'ora in un fuso orario designato nell'ora in un altro fuso orario designato.

Per informazioni dettagliate sulla conversione degli orari tra fusi orari, vedere Conversione degli orari tra fusi orari.

Vedi anche