Dela via


Gör så här: Räkna upp tidszoner som finns på en dator

För att kunna arbeta med en angiven tidszon krävs att information om tidszonen är tillgänglig för systemet. Operativsystemen Windows XP och Windows Vista lagrar den här informationen i registret. Men även om det totala antalet tidszoner som finns i hela världen är stort innehåller registret information om endast en delmängd av dem. Dessutom är själva registret en dynamisk struktur vars innehåll är föremål för både avsiktliga och oavsiktliga ändringar. Därför kan ett program inte alltid anta att en viss tidszon definieras och är tillgänglig i ett system. Det första steget för många program som använder tidszonsinformationsprogram är att avgöra om nödvändiga tidszoner är tillgängliga i det lokala systemet eller att ge användaren en lista över tidszoner som användaren ska välja mellan. Detta kräver att ett program räknar upp de tidszoner som definierats i ett lokalt system.

Kommentar

Om ett program förlitar sig på förekomsten av en viss tidszon som kanske inte definieras i ett lokalt system, kan programmet säkerställa dess närvaro genom att serialisera och deserialisera information om tidszonen. Tidszonen kan sedan läggas till i en listkontroll så att programanvändaren kan välja den. Mer information finns i Så här sparar du tidszoner till en inbäddad resurs och Så här återställer du tidszoner från en inbäddad resurs.

Räkna upp de tidszoner som finns i det lokala systemet

  1. TimeZoneInfo.GetSystemTimeZones Anropa metoden. Metoden returnerar en allmän ReadOnlyCollection<T> samling TimeZoneInfo objekt. Posterna i samlingen sorteras efter deras DisplayName egenskap. Till exempel:

    ReadOnlyCollection<TimeZoneInfo> tzCollection;
    tzCollection = TimeZoneInfo.GetSystemTimeZones();
    
    Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones
    
  2. Räkna upp de enskilda TimeZoneInfo objekten i samlingen med hjälp av en foreach loop (i C#) eller en For Each...Next loop (i Visual Basic) och utföra nödvändig bearbetning på varje objekt. Följande kod räknar ReadOnlyCollection<T> till exempel upp samlingen med TimeZoneInfo objekt som returneras i steg 1 och visar visningsnamnet för varje tidszon i konsolen.

    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
    

För att presentera användaren med en lista över tidszoner som finns i det lokala systemet

  1. TimeZoneInfo.GetSystemTimeZones Anropa metoden. Metoden returnerar en allmän ReadOnlyCollection<T> samling TimeZoneInfo objekt.

  2. Tilldela samlingen som returneras i steg 1 till egenskapen för DataSource ett Windows-formulär eller ASP.NET listkontroll.

  3. Hämta objektet TimeZoneInfo som användaren har valt.

Exemplet innehåller en bild för ett Windows-program.

Exempel

Exemplet startar ett Windows-program som visar de tidszoner som definierats i ett system i en listruta. Exemplet visar sedan en dialogruta som innehåller värdet för egenskapen för DisplayName tidszonsobjektet som användaren har valt.

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

De flesta listkontroller (till exempel System.Windows.Forms.ListBox kontrollen eller System.Web.UI.WebControls.BulletedList ) gör att du kan tilldela en samling objektvariabler till deras DataSource egenskap så länge samlingen implementerar IEnumerable gränssnittet. (Den generiska ReadOnlyCollection<T> klassen gör detta.) Om du vill visa ett enskilt objekt i samlingen anropar kontrollen objektets ToString metod för att extrahera strängen som används för att representera objektet. När det gäller TimeZoneInfo objekt returnerar TimeZoneInfo metoden objektets visningsnamn (värdet för dess DisplayNameToString egenskap).

Kommentar

Eftersom listkontroller anropar ett objekts ToString -metod kan du tilldela en samling TimeZoneInfo objekt till kontrollen, låta kontrollen visa ett beskrivande namn för varje objekt och hämta objektet TimeZoneInfo som användaren har valt. Detta eliminerar behovet av att extrahera en sträng för varje objekt i samlingen, tilldela strängen till en samling som i sin tur är tilldelad kontrollens DataSource egenskap, hämta strängen som användaren har valt och sedan använda den här strängen för att extrahera objektet som beskrivs.

Kompilera koden

Det här exemplet kräver:

Se även