Condividi tramite


Procedura: enumerare i fusi orari presenti in un computer

Aggiornamento: novembre 2007

Per poter utilizzare correttamente un determinato fuso orario è necessario che le relative informazioni siano disponibili nel sistema. Nei sistemi operativi Windows XP e Windows Vista tali informazioni vengono archiviate nel Registro di sistema. Sebbene nel mondo esistano molti fusi orari, le informazioni presenti nel Registro di sistema sono tuttavia relative solo a una parte di essi. Inoltre, il Registro di sistema è una struttura dinamica il cui contenuto è soggetto a modifiche intenzionali e accidentali. Di conseguenza, un'applicazione non può sempre presupporre che un determinato fuso orario sia definito e disponibile in un sistema. Il primo passaggio per molte applicazioni che si basano sulle informazioni del fuso orario è determinare se i fusi orari richiesti sono disponibili nel sistema locale o fornire all'utente un elenco di fusi orari da selezionare. A tale scopo, è necessario che un'applicazione sia in grado di enumerare i fusi orari definiti in un sistema locale.

Nota:

Se un'applicazione si basa sulla presenza di un determinato fuso orario che non può essere definito in un sistema locale, è possibile garantirne la presenza serializzando e deserializzando le informazioni sul fuso orario. È quindi possibile aggiungere il fuso orario a un elenco in modo da poter essere selezionato dall'utente dell'applicazione. Per ulteriori informazioni, vedere Procedura: salvare fusi orari in una risorsa incorporata e Procedura: ripristinare i fusi orari da una risorsa incorporata.

Per enumerare i fusi orari presenti nel sistema locale

  1. Chiamare il metodo TimeZoneInfo.GetSystemTimeZones. Il metodo restituisce un insieme ReadOnlyCollection<T> generico di oggetti TimeZoneInfo. Le voci dell'insieme sono ordinate in base alla relativa proprietà DisplayName. Ad esempio:

    Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones
    
    ReadOnlyCollection<TimeZoneInfo> tzCollection;
    tzCollection = TimeZoneInfo.GetSystemTimeZones();
    
  2. Enumerare i singoli oggetti TimeZoneInfo dell'insieme utilizzando un ciclo foreach (in C#) o un ciclo For Each.Next (in Visual Basic) ed eseguire tutte le elaborazioni necessarie su ogni oggetto. Nel codice seguente, ad esempio, viene enumerato l'insieme ReadOnlyCollection<T> degli oggetti TimeZoneInfo restituiti nel passaggio 1 ed elencato il nome visualizzato di ogni fuso orario nella console.

    For Each timeZone As TimeZoneInfo In tzCollection
       Console.WriteLine("   {0}: {1}", timeZone.Id, timeZone.DisplayName)
    Next
    
    foreach (TimeZoneInfo timeZone in tzCollection)
       Console.WriteLine("   {0}: {1}", timeZone.Id, timeZone.DisplayName);
    

Per visualizzare un elenco di fusi orari presenti nel sistema locale

  1. Chiamare il metodo TimeZoneInfo.GetSystemTimeZones. Il metodo restituisce un insieme ReadOnlyCollection<T> generico di oggetti TimeZoneInfo.

  2. Assegnare l'insieme restituito nel passaggio 1 alla proprietà DataSource di un controllo elenco Windows Forms o ASP.NET.

  3. Recuperare l'oggetto TimeZoneInfo selezionato dall'utente.

L'esempio si riferisce a un'applicazione Windows.

Esempio

Nell'esempio viene avviata un'applicazione Windows in cui i fusi orari definiti in un sistema vengono visualizzati in una casella di riepilogo. Nell'esempio viene quindi visualizzata una finestra di dialogo che contiene il valore della proprietà DisplayName dell'oggetto del fuso orario selezionato dall'utente.

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
   Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo)
   tzCollection = TimeZoneInfo.GetSystemTimeZones()
   Me.timeZoneList.DataSource = tzCollection
End Sub

Private Sub OkButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OkButton.Click
   Dim selectedTimeZone As TimeZoneInfo = DirectCast(Me.timeZoneList.SelectedItem(), TimeZoneInfo)
   MsgBox("You selected the " & selectedTimeZone.ToString() & " time zone.")
End Sub
private void Form1_Load(object sender, EventArgs e)
{
   ReadOnlyCollection<TimeZoneInfo> tzCollection; 
   tzCollection = TimeZoneInfo.GetSystemTimeZones();
   this.timeZoneList.DataSource = tzCollection;
}

private void OkButton_Click(object sender, EventArgs e)
{
   TimeZoneInfo selectedTimeZone = (TimeZoneInfo) this.timeZoneList.SelectedItem;
   MessageBox.Show("You selected the " + selectedTimeZone.ToString() + " time zone.");
}

La maggior parte dei controlli elenco, ad esempio il controllo System.Windows.Forms.ListBox o System.Web.UI.WebControls.BulletedList, consente di assegnare un insieme di variabili oggetto alla relativa proprietà DataSource, purché tale insieme implementi l'interfaccia IEnumerable. Tale operazione viene eseguita dalla classe ReadOnlyCollection<T>. Per visualizzare un singolo oggetto dell'insieme, il controllo chiama il metodo ToString di tale oggetto per estrarre la stringa utilizzata per rappresentare l'oggetto. Nel caso di oggetti TimeZoneInfo, il metodo ToString restituisce il nome visualizzato dell'oggetto TimeZoneInfo (il valore della relativa proprietà DisplayName).

Nota:

Poiché i controlli elenco chiamano il metodo ToString di un oggetto, è possibile assegnare un insieme di oggetti TimeZoneInfo al controllo, visualizzare un nome significativo per ogni oggetto del controllo e recuperare l'oggetto TimeZoneInfo selezionato dall'utente. In questo modo non è più necessario estrarre una stringa per ogni oggetto dell'insieme, assegnare la stringa a un insieme assegnato a sua volta alla proprietà DataSource del controllo, recuperare la stringa selezionata dall'utente e infine utilizzare questa stringa per estrarre l'oggetto descritto.

Compilazione del codice

Per questo esempio è necessario:

Vedere anche

Attività

Procedura: salvare fusi orari in una risorsa incorporata

Procedura: ripristinare i fusi orari da una risorsa incorporata

Altre risorse

Ora e fusi orari