Condividi tramite


Procedura: Enumerare i fusi orari presenti in un computer

Per usare correttamente un fuso orario designato, è necessario che le informazioni sul fuso orario siano disponibili per il sistema. I sistemi operativi Windows XP e Windows Vista archiviano queste informazioni nel Registro di sistema. Tuttavia, anche se il numero totale di fusi orari esistenti in tutto il mondo è elevato, il Registro di sistema contiene informazioni solo su un subset di essi. Inoltre, il registro stesso è una struttura dinamica il cui contenuto è soggetto a modifiche intenzionali e accidentali. Di conseguenza, un'applicazione non può sempre presupporre che un particolare fuso orario sia definito e disponibile in un sistema. Il primo passaggio per molte applicazioni che usano applicazioni di informazioni sul fuso orario consiste nel determinare se i fusi orari necessari sono disponibili nel sistema locale o fornire all'utente un elenco di fusi orari da cui selezionare. Ciò richiede che un'applicazione enumera i fusi orari definiti in un sistema locale.

Annotazioni

Se un'applicazione si basa sulla presenza di un particolare fuso orario che potrebbe non essere definito in un sistema locale, l'applicazione può garantire 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 restituisce una raccolta generica ReadOnlyCollection<T> di TimeZoneInfo oggetti. Le voci della raccolta vengono ordinate in base alla relativa DisplayName proprietà. Per esempio:

    ReadOnlyCollection<TimeZoneInfo> tzCollection;
    tzCollection = TimeZoneInfo.GetSystemTimeZones();
    
    Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones
    
  2. Enumerare i singoli TimeZoneInfo oggetti nella raccolta usando un foreach ciclo (in C#) o un ...For Each Next ciclo (in Visual Basic) ed eseguire tutte le elaborazioni necessarie su ogni oggetto. Ad esempio, il codice seguente enumera la ReadOnlyCollection<T> raccolta di TimeZoneInfo oggetti restituiti nel passaggio 1 ed elenca 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 restituisce una raccolta generica ReadOnlyCollection<T> di TimeZoneInfo oggetti.

  2. Assegnare la raccolta restituita nel passaggio 1 alla proprietà di un controllo elenco di Windows Forms o 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à dell'oggetto DisplayName 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 System.Windows.Forms.ListBox controllo o System.Web.UI.WebControls.BulletedList , consente di assegnare una raccolta di variabili oggetto alla relativa DataSource proprietà, purché tale raccolta implementi l'interfaccia IEnumerable . La classe generica ReadOnlyCollection<T> esegue questa operazione. Per visualizzare un singolo oggetto nell'insieme, il controllo chiama il metodo dell'oggetto ToString per estrarre la stringa utilizzata per rappresentare l'oggetto. Nel caso degli TimeZoneInfo oggetti, il ToString metodo restituisce il TimeZoneInfo nome visualizzato dell'oggetto (il valore della relativa DisplayName proprietà).

Annotazioni

Poiché i controlli elenco chiamano il metodo di ToString un oggetto, è possibile assegnare una raccolta di TimeZoneInfo oggetti 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à del DataSource controllo, recuperare la stringa selezionata dall'utente e quindi utilizzare questa stringa per estrarre l'oggetto descritto.

Compilazione del codice

Questo esempio richiede:

Vedere anche