Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Le informazioni precise sul fuso orario richieste da un'applicazione potrebbero non essere presenti in un particolare sistema per diversi motivi:
Il fuso orario non è mai stato definito nel registro del sistema locale.
I dati relativi al fuso orario sono stati modificati o rimossi dal Registro di sistema.
Il fuso orario non dispone di informazioni accurate sulle regolazioni del fuso orario per un determinato periodo storico.
In questi casi, è possibile chiamare il CreateCustomTimeZone metodo per definire il fuso orario richiesto dall'applicazione. È possibile usare i sovraccarichi di questo metodo per creare un fuso orario con o senza regole di regolazione. Se il fuso orario supporta l'ora legale, è possibile definire le regolazioni con regole di regolazione fisse o mobili. Per le definizioni di questi termini, vedere la sezione "Terminologia del fuso orario" in Panoramica del fuso orario.
Importante
I fusi orari personalizzati creati chiamando il CreateCustomTimeZone metodo non vengono aggiunti al Registro di sistema. È invece possibile accedervi solo tramite il riferimento all'oggetto restituito dalla chiamata al CreateCustomTimeZone metodo.
Questo argomento illustra come creare un fuso orario con regole di regolazione. Per creare un fuso orario che non supporta le regole di regolazione dell'ora legale, vedere Procedura: Creare fusi orari senza regole di rettifica.
Per creare un fuso orario con regole di regolazione mobile
Per ogni regolazione , ovvero per ogni transizione da e verso l'ora solare in un determinato intervallo di tempo, eseguire le operazioni seguenti:
Definire il tempo di transizione iniziale per la regolazione del fuso orario.
È necessario chiamare il TimeZoneInfo.TransitionTime.CreateFloatingDateRule metodo e passarlo un DateTime valore che definisce l'ora della transizione, un valore intero che definisce il mese della transizione, un valore intero che definisce la settimana in cui si verifica la transizione e un DayOfWeek valore che definisce il giorno della settimana in cui si verifica la transizione. Questa chiamata al metodo crea un'istanza di un oggetto TimeZoneInfo.TransitionTime.
Definire il tempo di transizione finale per la regolazione del fuso orario. È necessaria un'altra chiamata al TimeZoneInfo.TransitionTime.CreateFloatingDateRule metodo . Questa chiamata al metodo istanzia un secondo oggetto TimeZoneInfo.TransitionTime.
Chiamare il CreateAdjustmentRule metodo e passarvi le date di inizio e fine effettive della rettifica, un TimeSpan oggetto che definisce la quantità di tempo nella transizione e i due TimeZoneInfo.TransitionTime oggetti che definiscono quando si verificano le transizioni verso e dall'ora legale. Questa chiamata al metodo crea un'istanza di un oggetto TimeZoneInfo.AdjustmentRule.
Assegnare l'oggetto TimeZoneInfo.AdjustmentRule a una matrice di TimeZoneInfo.AdjustmentRule oggetti.
Definire il nome visualizzato del fuso orario. Il nome visualizzato segue un formato abbastanza standard in cui l'offset del fuso orario dall'ora UTC (Coordinated Universal Time) è racchiuso tra parentesi ed è seguito da una stringa che identifica il fuso orario, una o più città nel fuso orario o uno o più paesi o aree geografiche nel fuso orario.
Definire il nome del tempo standard del fuso orario. In genere, questa stringa viene usata anche come identificatore del fuso orario.
Definire il nome dell'ora legale del fuso orario.
Se si vuole usare un identificatore diverso dal nome standard del fuso orario, definire l'identificatore del fuso orario.
Istanziare un oggetto TimeSpan che definisce l'offset del fuso orario rispetto all'UTC. I fusi orari con orari successivi all'ora UTC hanno un offset positivo. I fusi orari con orari precedenti all'ora UTC hanno un offset negativo.
Chiamare il TimeZoneInfo.CreateCustomTimeZone(String, TimeSpan, String, String, String, TimeZoneInfo+AdjustmentRule[]) metodo per creare un'istanza del nuovo fuso orario.
Esempio
Nell'esempio seguente viene definito un fuso orario standard centrale per gli Stati Uniti che include regole di rettifica per un'ampia gamma di intervalli di tempo compresi tra il 1918 e il presente.
TimeZoneInfo cst;
// Declare necessary TimeZoneInfo.AdjustmentRule objects for time zone
TimeSpan delta = new(1, 0, 0);
TimeZoneInfo.AdjustmentRule adjustment;
List<TimeZoneInfo.AdjustmentRule> adjustmentList = [];
// Declare transition time variables to hold transition time information
TimeZoneInfo.TransitionTime transitionRuleStart, transitionRuleEnd;
// Define new Central Standard Time zone 6 hours earlier than UTC
// Define rule 1 (for 1918-1919)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 03, 05, DayOfWeek.Sunday);
transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 10, 05, DayOfWeek.Sunday);
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1918, 1, 1), new DateTime(1919, 12, 31), delta,
transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment);
// Define rule 2 (for 1942)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 2, 0, 0), 02, 09);
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1942, 1, 1), new DateTime(1942, 12, 31),
delta, transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment);
// Define rule 3 (for 1945)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 23, 0, 0), 08, 14);
transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 2, 0, 0), 09, 30);
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1945, 1, 1), new DateTime(1945, 12, 31),
delta, transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment);
// Define end rule (for 1967-2006)
transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 10, 5, DayOfWeek.Sunday);
// Define rule 4 (for 1967-73)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 04, 05, DayOfWeek.Sunday);
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1967, 1, 1), new DateTime(1973, 12, 31),
delta, transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment);
// Define rule 5 (for 1974 only)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 2, 0, 0), 01, 06);
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1974, 1, 1), new DateTime(1974, 12, 31),
delta, transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment);
// Define rule 6 (for 1975 only)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 2, 0, 0), 02, 23);
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1975, 1, 1), new DateTime(1975, 12, 31),
delta, transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment);
// Define rule 7 (1976-1986)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 04, 05, DayOfWeek.Sunday);
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1976, 1, 1), new DateTime(1986, 12, 31),
delta, transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment);
// Define rule 8 (1987-2006)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 04, 01, DayOfWeek.Sunday);
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1987, 1, 1), new DateTime(2006, 12, 31),
delta, transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment);
// Define rule 9 (2007- )
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 03, 02, DayOfWeek.Sunday);
transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 11, 01, DayOfWeek.Sunday);
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(2007, 1, 1), DateTime.MaxValue.Date,
delta, transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment);
// Convert list of adjustment rules to an array
TimeZoneInfo.AdjustmentRule[] adjustments = new TimeZoneInfo.AdjustmentRule[adjustmentList.Count];
adjustmentList.CopyTo(adjustments);
cst = TimeZoneInfo.CreateCustomTimeZone("Central Standard Time", new TimeSpan(-6, 0, 0),
"(GMT-06:00) Central Time (US Only)", "Central Standard Time",
"Central Daylight Time", adjustments);
Dim cst As TimeZoneInfo
' Declare necessary TimeZoneInfo.AdjustmentRule objects for time zone
Dim delta As New TimeSpan(1, 0, 0)
Dim adjustment As TimeZoneInfo.AdjustmentRule
Dim adjustmentList As New List(Of TimeZoneInfo.AdjustmentRule)
' Declare transition time variables to hold transition time information
Dim transitionRuleStart, transitionRuleEnd As TimeZoneInfo.TransitionTime
' Define new Central Standard Time zone 6 hours earlier than UTC
' Define rule 1 (for 1918-1919)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#02:00:00AM#, 03, 05, DayOfWeek.Sunday)
transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#02:00:00AM#, 10, 05, DayOfWeek.Sunday)
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/1918#, #12/31/1919#, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment)
' Define rule 2 (for 1942)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(#2:00:00AM#, 02, 09)
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/1942#, #12/31/1942#, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment)
' Define rule 3 (for 1945)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(#11:00:00PM#, 08, 14)
transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFixedDateRule(#2:00:00AM#, 09, 30)
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/1945#, #12/31/1945#, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment)
' Define end rule (for 1967-2006)
transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#02:00:00AM#, 10, 5, DayOfWeek.Sunday)
' Define rule 4 (for 1967-73)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#2:00:00AM#, 04, 05, DayOfWeek.Sunday)
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/1967#, #12/31/1973#, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment)
' Define rule 5 (for 1974 only)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(#2:00:00AM#, 01, 06)
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/1974#, #12/31/1974#, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment)
' Define rule 6 (for 1975 only)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(#2:00:00AM#, 02, 23)
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/1975#, #12/31/1975#, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment)
' Define rule 7 (1976-1986)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#2:00:00AM#, 04, 05, DayOfWeek.Sunday)
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/1976#, #12/31/1986#, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment)
' Define rule 8 (1987-2006)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#2:00:00AM#, 04, 01, DayOfWeek.Sunday)
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/1987#, #12/31/2006#, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment)
' Define rule 9 (2007- )
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#2:00:00AM#, 03, 02, DayOfWeek.Sunday)
transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#2:00:00AM#, 11, 01, DayOfWeek.Sunday)
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/2007#, Date.MaxValue.Date, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment)
' Convert list of adjustment rules to an array
Dim adjustments(adjustmentList.Count - 1) As TimeZoneInfo.AdjustmentRule
adjustmentList.CopyTo(adjustments)
cst = TimeZoneInfo.CreateCustomTimeZone("Central Standard Time", New TimeSpan(-6, 0, 0), _
"(GMT-06:00) Central Time (US Only)", "Central Standard Time", _
"Central Daylight Time", adjustments)
Il fuso orario creato in questo esempio include più regole di regolazione. Occorre prestare attenzione a garantire che le date di inizio e di fine effettive di qualsiasi regola di rettifica non si sovrappongano alle date di un'altra regola di rettifica. Se si verifica una sovrapposizione, viene generata un'eccezione InvalidTimeZoneException .
Per le regole di regolazione mobile, il valore 5 viene passato al week
parametro del CreateFloatingDateRule metodo per indicare che la transizione si verifica nell'ultima settimana di un determinato mese.
Nella creazione della matrice di TimeZoneInfo.AdjustmentRule oggetti da utilizzare nella chiamata al TimeZoneInfo.CreateCustomTimeZone(String, TimeSpan, String, String, String, TimeZoneInfo+AdjustmentRule[]) metodo, il codice potrebbe inizializzare la matrice in base alle dimensioni richieste dal numero di regolazioni da creare per il fuso orario. In questo esempio di codice viene invece chiamato il Add metodo per aggiungere ogni regola di regolazione a una raccolta generica List<T> di TimeZoneInfo.AdjustmentRule oggetti. Il codice chiama quindi il CopyTo metodo per copiare i membri di questa raccolta nella matrice.
Nell'esempio viene inoltre utilizzato il CreateFixedDateRule metodo per definire le regolazioni a data fissa. Questa operazione è simile alla chiamata al CreateFloatingDateRule metodo , ad eccezione del fatto che richiede solo l'ora, il mese e il giorno dei parametri di transizione.
L'esempio può essere testato usando codice simile al seguente:
TimeZoneInfo est = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime pastDate1 = new(1942, 2, 11);
Console.WriteLine($"Is {pastDate1} daylight saving time: {cst.IsDaylightSavingTime(pastDate1)}");
DateTime pastDate2 = new(1967, 10, 29, 1, 30, 00);
Console.WriteLine($"Is {pastDate2} ambiguous: {cst.IsAmbiguousTime(pastDate2)}");
DateTime pastDate3 = new(1974, 1, 7, 2, 59, 00);
Console.WriteLine("{0} {1} is {2} {3}",
pastDate3,
est.IsDaylightSavingTime(pastDate3) ? est.DaylightName : est.StandardName,
TimeZoneInfo.ConvertTime(pastDate3, est, cst),
cst.IsDaylightSavingTime(TimeZoneInfo.ConvertTime(pastDate3, est, cst)) ? cst.DaylightName : cst.StandardName);
// This code produces the following output to the console:
//
// Is 2/11/1942 12:00:00 AM daylight saving time: True
// Is 10/29/1967 1:30:00 AM ambiguous: True
// 1/7/1974 2:59:00 AM Eastern Standard Time is 1/7/1974 2:59:00 AM Central Daylight Time
Dim est As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")
Dim pastDate1 As Date = #2/11/1942#
Console.WriteLine("Is {0} daylight saving time: {1}", pastDate1, _
cst.IsDaylightSavingTime(pastDate1))
Dim pastDate2 As Date = #10/29/1967 1:30AM#
Console.WriteLine("Is {0} ambiguous: {1}", pastDate2, _
cst.IsAmbiguousTime(pastDate2))
Dim pastDate3 As Date = #1/7/1974 2:59AM#
Console.WriteLine("{0} {1} is {2} {3}", pastDate3, _
IIf(est.IsDaylightSavingTime(pastDate3), _
est.DaylightName, est.StandardName), _
TimeZoneInfo.ConvertTime(pastDate3, est, cst), _
IIf(cst.IsDaylightSavingTime(TimeZoneInfo.ConvertTime(pastDate3, est, cst)), _
cst.DaylightName, cst.StandardName))
'
' This code produces the following output to the console:
'
' Is 2/11/1942 12:00:00 AM daylight saving time: True
' Is 10/29/1967 1:30:00 AM ambiguous: True
' 1/7/1974 2:59:00 AM Eastern Standard Time is 1/7/1974 2:59:00 AM Central Daylight Time
Compilazione del codice
Questo esempio richiede:
Importare i seguenti spazi dei nomi:
using System.Collections.Generic;
Imports System.Collections.Generic Imports System.Collections.ObjectModel
Vedere anche
- Date, ore e fusi orari
- panoramica del fuso orario
- Procedura: Creare fusi orari senza regole di rettifica