Procedura: Enumerare i fusi orari presenti in un computer

Per poter usare correttamente un determinato fuso orario è necessario che nel sistema siano disponibili le informazioni sul fuso orario. I sistemi operativi Windows XP e Windows Vista archiviano queste informazioni nel Registro di sistema. Sebbene nel mondo esistano molti fusi orari, le informazioni presenti nel Registro di sistema sono 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 offrire 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 particolare fuso orario che potrebbe non essere definito in un sistema locale, l'applicazione può garantirne la presenza serializzando e deserializzando le informazioni sul fuso orario. Il fuso orario può quindi essere aggiunto a un controllo elenco in modo che l'utente dell'applicazione possa selezionarlo. Per informazioni dettagliate, vedere Procedura: Salvare fusi orari in una risorsa incorporata e Procedura: Ripristinare fusi orari da una risorsa incorporata.

Per enumerare i fusi orari presenti nel sistema locale

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

    ReadOnlyCollection<TimeZoneInfo> tzCollection;
    tzCollection = TimeZoneInfo.GetSystemTimeZones();
    
    Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones
    
  2. Enumerare i singoli oggetti TimeZoneInfo nella raccolta usando un ciclo foreach (in C#) o un For Each...Eseguire un ciclo Next (in Visual Basic) ed eseguire qualsiasi elaborazione necessaria in ogni oggetto. Nel codice seguente, ad esempio, viene enumerata la raccolta ReadOnlyCollection<T> degli oggetti TimeZoneInfo restituiti nel passaggio 1 ed elencato il nome visualizzato di ogni fuso orario nella console.

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

Per presentare all'utente un elenco di fusi orari presenti nel sistema locale

  1. Chiamare il metodo TimeZoneInfo.GetSystemTimeZones . Il metodo ReadOnlyCollection<T> restituisce una raccolta di oggetti TimeZoneInfo.

  2. Assegnare la raccolta restituita nel passaggio 1 alla proprietà DataSource di un Windows Forms o un elenco ASP.NET.

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

L'esempio fornisce un'illustrazione di un'applicazione Windows.

Esempio

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

private void Form1_Load(object sender, EventArgs e)
{
    ReadOnlyCollection<TimeZoneInfo> tzCollection;
    tzCollection = TimeZoneInfo.GetSystemTimeZones();
    _timeZoneList.DataSource = tzCollection;
}

private void OkButton_Click(object sender, EventArgs e)
{
    TimeZoneInfo? selectedTimeZone = (TimeZoneInfo?)_timeZoneList.SelectedItem;
    MessageBox.Show($"You selected the {selectedTimeZone?.ToString()} time zone.");
}
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

La maggior parte dei controlli elenco ,ad esempio il controllo System.Windows.Forms.ListBox o System.Web.UI.WebControls.BulletedList, consente di assegnare una raccolta di variabili oggetto alla relativa proprietà DataSource, purché tale raccolta implementi l'interfaccia IEnumerable. Lo fa anche la classe generica ReadOnlyCollection<T>. Per visualizzare un singolo oggetto nell'insieme, il controllo chiama il metodo ToString dell'oggetto per estrarre la stringa utilizzata per rappresentare l'oggetto. Nel caso degli 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 una raccolta di oggetti TimeZoneInfo al controllo, visualizzare un nome significativo per ogni oggetto e recuperare l'oggetto TimeZoneInfo selezionato dall'utente. In questo modo si elimina la necessità di estrarre una stringa per ogni oggetto nell'insieme, assegnare la stringa a una raccolta assegnata a sua volta alla proprietà DataSource del controllo, recuperare la stringa selezionata dall'utente e quindi utilizzare questa stringa per estrarre l'oggetto descritto.

Compilazione del codice

L'esempio presenta i requisiti seguenti:

Vedi anche