Procedure: Tijdzones inventariseren die aanwezig zijn op een computer
Als u met een aangewezen tijdzone werkt, moet informatie over die tijdzone beschikbaar zijn voor het systeem. De besturingssystemen Windows XP en Windows Vista slaan deze informatie op in het register. Hoewel het totale aantal tijdzones over de hele wereld groot is, bevat het register echter informatie over slechts een subset ervan. Daarnaast is het register zelf een dynamische structuur waarvan de inhoud onderhevig is aan zowel opzettelijke als onbedoelde wijzigingen. Als gevolg hiervan kan een toepassing niet altijd aannemen dat een bepaalde tijdzone is gedefinieerd en beschikbaar is op een systeem. De eerste stap voor veel toepassingen die gebruikmaken van tijdzone-informatietoepassingen is om te bepalen of vereiste tijdzones beschikbaar zijn op het lokale systeem, of om de gebruiker een lijst met tijdzones te geven waaruit moet worden geselecteerd. Hiervoor moet een toepassing de tijdzones opsommen die zijn gedefinieerd op een lokaal systeem.
Notitie
Als een toepassing afhankelijk is van de aanwezigheid van een bepaalde tijdzone die mogelijk niet is gedefinieerd op een lokaal systeem, kan de toepassing ervoor zorgen dat deze aanwezig is door informatie over de tijdzone te serialiseren en deserialiseren. De tijdzone kan vervolgens worden toegevoegd aan een lijstbeheer, zodat de gebruiker van de toepassing deze kan selecteren. Voor meer informatie raadpleegt u: Tijdzones opslaan in een ingesloten resource en procedures: tijdzones herstellen vanuit een ingesloten resource.
De tijdzones opsommen die aanwezig zijn op het lokale systeem
Roep de TimeZoneInfo.GetSystemTimeZones methode aan. De methode retourneert een algemene ReadOnlyCollection<T> verzameling TimeZoneInfo objecten. De vermeldingen in de verzameling worden gesorteerd op hun DisplayName eigenschap. Voorbeeld:
ReadOnlyCollection<TimeZoneInfo> tzCollection; tzCollection = TimeZoneInfo.GetSystemTimeZones();
Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones
De afzonderlijke TimeZoneInfo objecten in de verzameling opsommen met behulp van een
foreach
lus (in C#) of eenFor Each
...Next
lus (in Visual Basic) en voer de benodigde verwerking voor elk object uit. Met de volgende code wordt bijvoorbeeld de ReadOnlyCollection<T> verzameling TimeZoneInfo objecten opgesomd die in stap 1 worden geretourneerd en wordt de weergavenaam van elke tijdzone op de console vermeld.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
De gebruiker presenteren met een lijst met tijdzones die aanwezig zijn op het lokale systeem
Roep de TimeZoneInfo.GetSystemTimeZones methode aan. De methode retourneert een algemene ReadOnlyCollection<T> verzameling TimeZoneInfo objecten.
Wijs de verzameling die in stap 1 is geretourneerd toe aan de
DataSource
eigenschap van een Windows-formulieren of ASP.NET lijstbesturingselement.Haal het TimeZoneInfo object op dat de gebruiker heeft geselecteerd.
Het voorbeeld bevat een afbeelding voor een Windows-toepassing.
Opmerking
In het voorbeeld wordt een Windows-toepassing gestart waarin de tijdzones worden weergegeven die zijn gedefinieerd op een systeem in een keuzelijst. In het voorbeeld wordt vervolgens een dialoogvenster weergegeven met de waarde van de DisplayName eigenschap van het tijdzoneobject dat door de gebruiker is geselecteerd.
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
Met de meeste lijstbesturingselementen (zoals het System.Windows.Forms.ListBox of System.Web.UI.WebControls.BulletedList besturingselement) kunt u een verzameling objectvariabelen toewijzen aan hun DataSource
eigenschap zolang die verzameling de IEnumerable interface implementeert. (De algemene ReadOnlyCollection<T> klasse doet dit.) Als u een afzonderlijk object in de verzameling wilt weergeven, roept het besturingselement de methode van ToString
dat object aan om de tekenreeks te extraheren die wordt gebruikt om het object weer te geven. In het geval van objecten retourneert de ToString
methode de weergavenaam van TimeZoneInfo het TimeZoneInfo object (de waarde van de eigenschap).DisplayName
Notitie
Omdat lijstbesturingselementen de methode van TimeZoneInfo een object ToString
aanroepen, kunt u een verzameling objecten toewijzen aan het besturingselement, het besturingselement een betekenisvolle naam laten weergeven voor elk object en het TimeZoneInfo object ophalen dat de gebruiker heeft geselecteerd. Hierdoor hoeft u geen tekenreeks te extraheren voor elk object in de verzameling, de tekenreeks toe te wijzen aan een verzameling die op zijn beurt is toegewezen aan de eigenschap van DataSource
het besturingselement, de tekenreeks op te halen die de gebruiker heeft geselecteerd en deze tekenreeks vervolgens te gebruiken om het object te extraheren dat wordt beschreven.
De code compileren
Voor dit voorbeeld is het volgende vereist:
De volgende naamruimten worden geïmporteerd:
System (in C#-code)