Procedura: Ottenere un oggetto TimeZoneInfo

Il modo più comune per ottenere un TimeZoneInfo oggetto consiste nel recuperare informazioni su di esso dal Registro di sistema. Per ottenere l'oggetto, chiamare il static metodo (Shared in Visual Basic) TimeZoneInfo.FindSystemTimeZoneById che cerca nel Registro di sistema. Gestire eventuali eccezioni generate dal metodo , in particolare l'eccezione TimeZoneNotFoundException generata se il fuso orario non è definito nel Registro di sistema.

Nota

A partire da .NET 8, TimeZoneInfo.FindSystemTimeZoneById restituisce un oggetto memorizzato TimeZoneInfo nella cache anziché creare un'istanza di un nuovo oggetto. Per altre informazioni, vedere FindSystemTimeZoneById non restituisce un nuovo oggetto.

Esempio

Nel codice seguente viene recuperato un oggetto TimeZoneInfo che rappresenta il fuso Ora solare fuso orientale e viene visualizzata l'Ora solare fuso orientale che corrisponde all'ora locale.

DateTime timeNow = DateTime.Now;
try
{
    TimeZoneInfo easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
    DateTime easternTimeNow = TimeZoneInfo.ConvertTime(
        timeNow,
        TimeZoneInfo.Local,
        easternZone
        );
    Console.WriteLine("{0} {1} corresponds to {2} {3}.",
                      timeNow,
                      TimeZoneInfo.Local.IsDaylightSavingTime(timeNow) ?
                                TimeZoneInfo.Local.DaylightName :
                                TimeZoneInfo.Local.StandardName,
                      easternTimeNow,
                      easternZone.IsDaylightSavingTime(easternTimeNow) ?
                                  easternZone.DaylightName :
                                  easternZone.StandardName);
}
// Handle exception
//
// As an alternative to simply displaying an error message, an alternate Eastern
// Standard Time TimeZoneInfo object could be instantiated here either by restoring
// it from a serialized string or by providing the necessary data to the
// CreateCustomTimeZone method.
catch (TimeZoneNotFoundException)
{
    Console.WriteLine("The Eastern Standard Time Zone cannot be found on the local system.");
}
catch (InvalidTimeZoneException)
{
    Console.WriteLine("The Eastern Standard Time Zone contains invalid or missing data.");
}
catch (SecurityException)
{
    Console.WriteLine("The application lacks permission to read time zone information from the registry.");
}
catch (OutOfMemoryException)
{
    Console.WriteLine("Not enough memory is available to load information on the Eastern Standard Time zone.");
}
// If we weren't passing FindSystemTimeZoneById a literal string, we also
// would handle an ArgumentNullException.
Dim timeNow As Date = Date.Now
Try
    Dim easternZone As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")
    Dim easternTimeNow As Date = TimeZoneInfo.ConvertTime(timeNow, TimeZoneInfo.Local, easternZone)
    Console.WriteLine("{0} {1} corresponds to {2} {3}.", _
                      timeNow, _
                      IIf(TimeZoneInfo.Local.IsDaylightSavingTime(timeNow), _
                          TimeZoneInfo.Local.DaylightName, TimeZoneInfo.Local.StandardName), _
                      easternTimeNow, _
                      IIf(easternZone.IsDaylightSavingTime(easternTimeNow), _
                          easternZone.DaylightName, easternZone.StandardName))
    ' Handle exception
    '
    ' As an alternative to simply displaying an error message, an alternate Eastern
    ' Standard Time TimeZoneInfo object could be instantiated here either by restoring
    ' it from a serialized string or by providing the necessary data to the
    ' CreateCustomTimeZone method.
Catch e As TimeZoneNotFoundException
    Console.WriteLine("The Eastern Standard Time Zone cannot be found on the local system.")
Catch e As InvalidTimeZoneException
    Console.WriteLine("The Eastern Standard Time Zone contains invalid or missing data.")
Catch e As SecurityException
    Console.WriteLine("The application lacks permission to read time zone information from the registry.")
Catch e As OutOfMemoryException
    Console.WriteLine("Not enough memory is available to load information on the Eastern Standard Time zone.")
    ' If we weren't passing FindSystemTimeZoneById a literal string, we also 
    ' would handle an ArgumentNullException.
End Try

L'unico parametro del metodo TimeZoneInfo.FindSystemTimeZoneById è l'identificatore del fuso orario da recuperare, che corrisponde alla proprietà TimeZoneInfo.Id dell'oggetto. L'identificatore del fuso orario è un campo chiave che identifica in modo univoco il fuso orario. Benché la maggior parte delle chiavi sia relativamente breve, in confronto l'identificatore del fuso orario è piuttosto lungo. In molti casi, il valore corrisponde alla proprietà StandardName di un oggetto TimeZoneInfo , usato per fornire il nome dell'ora solare del fuso orario. Tuttavia, vi sono alcune eccezioni. Il modo migliore per verificare che venga fornito un identificatore valido consiste nell'enumerare i fusi orari disponibili nel sistema e annotare i relativi identificatori dei fusi orari. Per informazioni generali, vedere How to: Enumerate time zones present on a computer. L'articolo Ricerca dei fusi orari definiti in un sistema locale contiene anche un elenco di identificatori di fuso orario selezionati.

Se il fuso orario viene trovato, il metodo restituisce l'oggetto TimeZoneInfo . Se il fuso orario non viene trovato, il metodo genera un'eccezione TimeZoneNotFoundException. Se invece il fuso orario viene trovato ma i dati sono danneggiati o incompleti, il metodo genera un'eccezione InvalidTimeZoneException.

Se l'applicazione si basa su un fuso orario che deve essere presente, chiamare prima il metodo FindSystemTimeZoneById per recuperare le informazioni del fuso orario dal Registro di sistema. Se la chiamata al metodo non riesce, il gestore di eccezioni deve creare una nuova istanza del fuso orario o deve ricrearlo deserializzando un oggetto TimeZoneInfo serializzato. Per un esempio, vedere Procedura: Ripristinare fusi orari da una risorsa incorporata.

Vedi anche