Condividi tramite


Procedura: creare un'istanza di un oggetto TimeZoneInfo

Aggiornamento: novembre 2007

Il metodo più comune per creare un'istanza di un oggetto TimeZoneInfo è recuperarne informazioni dal Registro di sistema. In questo argomento viene illustrato come creare un'istanza di un oggetto TimeZoneInfo dal Registro di sistema locale.

Per creare un'istanza di un oggetto TimeZoneInfo

  1. Dichiarare un oggetto TimeZoneInfo.

  2. Chiamare il metodo static (Shared in Visual Basic) TimeZoneInfo.FindSystemTimeZoneById.

  3. Gestire tutte le eccezioni generate dal metodo, in particolare TimeZoneNotFoundException generata se il fuso orario non è definito nel Registro di sistema.

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.

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
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.

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 il fuso orario in modo univoco. Mentre la maggior parte delle chiavi è relativamente breve, l'identificatore del fuso orario è piuttosto lungo. In molti casi, il valore corrisponde alla proprietà StandardName di un oggetto TimeZoneInfo, utilizzato per fornire il nome dell'ora solare del fuso orario. Esistono tuttavia delle 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 Procedura: enumerare i fusi orari presenti in un computer. Nell'argomento Ricerca dei fusi orari definiti in un sistema locale è presente inoltre un elenco di identificatori dei fusi orari 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 i fusi orari da una risorsa incorporata.

Compilazione del codice

Per questo esempio è necessario:

  • Aggiungere un riferimento a System.Core.dll al progetto.

  • Importare lo spazio dei nomi System con l'istruzione using (richiesto nel codice C#).

Vedere anche

Attività

Procedura: accedere agli oggetti predefiniti dell'ora UTC e del fuso orario locale

Concetti

Ricerca dei fusi orari definiti in un sistema locale

Altre risorse

Ora e fusi orari