Delen via


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

  1. 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
    
  2. De afzonderlijke TimeZoneInfo objecten in de verzameling opsommen met behulp van een foreach lus (in C#) of een For 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

  1. Roep de TimeZoneInfo.GetSystemTimeZones methode aan. De methode retourneert een algemene ReadOnlyCollection<T> verzameling TimeZoneInfo objecten.

  2. Wijs de verzameling die in stap 1 is geretourneerd toe aan de DataSource eigenschap van een Windows-formulieren of ASP.NET lijstbesturingselement.

  3. 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:

Zie ook