Freigeben über


Vorgehensweise: Aufzählen der auf einem Computer vorhandenen Zeitzonen

Für die erfolgreiche Verarbeitung einer Zeitzone ist es erforderlich, dass dem System Informationen zu dieser Zeitzone zur Verfügung stehen. Bei den Betriebssystemen Windows XP und Windows Vista wird diese Informationen in der Registrierung gespeichert. Es gibt zwar sehr viele Zeitzonen auf der Welt, die Registrierung enthält aber nur Informationen zu einigen davon. Darüber hinaus ist die Registrierung selbst eine dynamische Struktur, deren Inhalt absichtlich oder aus Versehen geändert werden kann. Daher kann eine Anwendung nicht voraussetzen, dass eine bestimmte Zeitzone in einem System definiert und verfügbar ist. Bei vielen Anwendungen, die Zeitzoneninformationen verwenden, besteht der erste Schritt darin zu ermitteln, ob die erforderlichen Zeitzonen im lokalen System verfügbar sind, oder dem Benutzer eine Liste der Zeitzonen zur Auswahl zu bieten. Dafür wiederum muss eine Anwendung die im lokalen System definierten Zeitzonen aufzählen können.

Hinweis

Wenn für eine Anwendung eine bestimmte Zeitzone nötig ist, die möglicherweise nicht auf einem lokalen System definiert ist, kann die Anwendung das Vorhandensein dieser Zeitzone sicherstellen, indem sie Informationen über die Zeitzone serialisiert und deserialisiert. Die Zeitzone kann dann einem Listensteuerelement hinzugefügt werden, damit die Anwendungsbenutzer*innen sie auswählen können. Weitere Informationen finden Sie unter Vorgehensweise: Speichern von Zeitzonen in einer eingebetteten Ressource und Vorgehensweise: Wiederherstellen von Zeitzonen aus einer eingebetteten Ressource.

Aufzählen der im lokalen System vorhandenen Zeitzonen

  1. Rufen Sie die TimeZoneInfo.GetSystemTimeZones-Methode auf. Die Methode gibt eine generische ReadOnlyCollection<T>-Sammlung von TimeZoneInfo-Objekten zurück. Die Einträge in der Sammlung sind nach ihrer DisplayName-Eigenschaft sortiert. Beispiel:

    ReadOnlyCollection<TimeZoneInfo> tzCollection;
    tzCollection = TimeZoneInfo.GetSystemTimeZones();
    
    Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones
    
  2. Listen Sie die einzelnen TimeZoneInfo-Objekte in der Sammlung mit einer foreach-Schleife (in C#) oder einer For EachNext-Schleife (in Visual Basic) auf, und führen Sie alle erforderlichen Verarbeitungen für jedes Objekt aus. Der folgende Code listet beispielsweise die ReadOnlyCollection<T>-Sammlung von TimeZoneInfo-Objekten auf, die in Schritt 1 zurückgegeben wurden, und gibt den Anzeigenamen jeder Zeitzone in der Konsole aus.

    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
    

So präsentieren Sie Benutzer*innen eine Liste der Zeitzonen, die auf dem lokalen System vorhanden sind

  1. Rufen Sie die TimeZoneInfo.GetSystemTimeZones-Methode auf. Die Methode gibt eine generische ReadOnlyCollection<T>-Sammlung von TimeZoneInfo-Objekten zurück.

  2. Weisen Sie die in Schritt 1 zurückgegebene Sammlung der DataSource-Eigenschaft eines Windows Forms- oder ASP.NET-Listensteuerelements zu.

  3. Rufen Sie das TimeZoneInfo-Objekt ab, das die Benutzer*innen ausgewählt haben.

Das Beispiel enthält eine Abbildung für eine Windows-Anwendung.

Beispiel

Im Beispiel wird eine Windows-Anwendung gestartet, die die für ein System definierten Zeitzonen in einem Listenfeld anzeigt. Im Beispiel wird dann ein Dialogfeld angezeigt, das den Wert der DisplayName-Eigenschaft des von den Benutzer*innen ausgewählten Zeitzonenobjekts enthält.

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

Die meisten Listensteuerelemente (z. B. das System.Windows.Forms.ListBox- oder System.Web.UI.WebControls.BulletedList-Steuerelement) ermöglichen es, ihrer DataSource-Eigenschaft eine Sammlung von Objektvariablen zuzuweisen, solange diese Sammlung die IEnumerable-Schnittstelle implementiert. (Die generische ReadOnlyCollection<T>-Klasse tut dies.) Um ein einzelnes Objekt in der Sammlung anzuzeigen, ruft das Steuerelement die ToString-Methode dieses Objekts auf, um die Zeichenfolge zu extrahieren, die zum Darstellen des Objekts verwendet wird. Im Fall von TimeZoneInfo-Objekten gibt die ToString-Methode den Anzeigenamen des TimeZoneInfo-Objekts (den Wert seiner DisplayName-Eigenschaft) zurück.

Hinweis

Da Listensteuerelemente die ToString-Methode eines Objekts aufrufen, können Sie dem Steuerelement eine Sammlung von TimeZoneInfo-Objekten zuweisen, das Steuerelement einen aussagekräftigen Namen für jedes Objekt anzeigen lassen und das TimeZoneInfo-Objekt abrufen, das die Benutzer*innen ausgewählt haben. Dadurch entfällt die Notwendigkeit, eine Zeichenfolge für jedes Objekt in der Sammlung zu extrahieren, die Zeichenfolge einer Sammlung zuzuweisen, die wiederum der DataSource-Eigenschaft des Steuerelements zugewiesen ist, die von den Benutzer*innen ausgewählte Zeichenfolge abzurufen und dann diese Zeichenfolge zu verwenden, um das von ihr beschriebene Objekt zu extrahieren.

Kompilieren des Codes

Für dieses Beispiel benötigen Sie Folgendes:

Weitere Informationen