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
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
Listen Sie die einzelnen TimeZoneInfo-Objekte in der Sammlung mit einer
foreach
-Schleife (in C#) oder einerFor Each
…Next
-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
Rufen Sie die TimeZoneInfo.GetSystemTimeZones-Methode auf. Die Methode gibt eine generische ReadOnlyCollection<T>-Sammlung von TimeZoneInfo-Objekten zurück.
Weisen Sie die in Schritt 1 zurückgegebene Sammlung der
DataSource
-Eigenschaft eines Windows Forms- oder ASP.NET-Listensteuerelements zu.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:
Dass die folgenden Namespaces importiert werden:
System (im C#-Code)