Instrukcje: Wykazywanie stref czasowych na komputerze

Pomyślna praca z wyznaczoną strefą czasową wymaga, aby informacje o tej strefie czasowej zostały udostępnione systemowi. Systemy operacyjne Windows XP i Windows Vista przechowują te informacje w rejestrze. Jednak mimo że łączna liczba stref czasowych, które istnieją na całym świecie, rejestr zawiera informacje o tylko podzestawie. Ponadto sam rejestr jest strukturą dynamiczną, której zawartość podlega zarówno celowej, jak i przypadkowej zmianie. W związku z tym aplikacja nie może zawsze zakładać, że określona strefa czasowa jest zdefiniowana i dostępna w systemie. Pierwszym krokiem dla wielu aplikacji korzystających z aplikacji informacyjnych strefy czasowej jest określenie, czy wymagane strefy czasowe są dostępne w systemie lokalnym, czy też nadać użytkownikowi listę stref czasowych, z których mają być wybrane. Wymaga to, aby aplikacja wyliczała strefy czasowe zdefiniowane w systemie lokalnym.

Uwaga

Jeśli aplikacja opiera się na obecności określonej strefy czasowej, która może nie być zdefiniowana w systemie lokalnym, aplikacja może zapewnić jej obecność, serializując i deserializacji informacji o strefie czasowej. Strefę czasową można następnie dodać do kontrolki listy, aby użytkownik aplikacji mógł ją wybrać. Aby uzyskać szczegółowe informacje, zobacz How to: Save Time Zones to an Embedded Resource (Instrukcje: zapisywanie stref czasowych w zasobie osadzonym) i How to: Restore time zones from an embedded resource (Jak przywrócić strefy czasowe z zasobu osadzonego).

Aby wyliczyć strefy czasowe obecne w systemie lokalnym

  1. Wywołaj metodę TimeZoneInfo.GetSystemTimeZones . Metoda zwraca ogólną ReadOnlyCollection<T> kolekcję TimeZoneInfo obiektów. Wpisy w kolekcji są sortowane według ich DisplayName właściwości. Na przykład:

    ReadOnlyCollection<TimeZoneInfo> tzCollection;
    tzCollection = TimeZoneInfo.GetSystemTimeZones();
    
    Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones
    
  2. Wyliczanie poszczególnych TimeZoneInfo obiektów w kolekcji przy użyciu foreach pętli (w języku C#) lub For Each...Next pętla (w Visual Basic) i wykonaj wszelkie niezbędne operacje na każdym obiekcie. Na przykład poniższy kod wylicza ReadOnlyCollection<T> kolekcję TimeZoneInfo obiektów zwróconych w kroku 1 i wyświetla nazwę wyświetlaną każdej strefy czasowej w konsoli programu .

    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
    

Aby przedstawić użytkownikowi listę stref czasowych znajdujących się w systemie lokalnym

  1. Wywołaj metodę TimeZoneInfo.GetSystemTimeZones . Metoda zwraca ogólną ReadOnlyCollection<T> kolekcję TimeZoneInfo obiektów.

  2. Przypisz kolekcję zwróconą w kroku 1 do DataSource właściwości kontrolki formularzy systemu Windows lub ASP.NET listy.

  3. TimeZoneInfo Pobierz obiekt wybrany przez użytkownika.

Przykład zawiera ilustrację dla aplikacji systemu Windows.

Przykład

Przykład uruchamia aplikację systemu Windows, która wyświetla strefy czasowe zdefiniowane w systemie w polu listy. W przykładzie zostanie wyświetlone okno dialogowe zawierające wartość DisplayName właściwości obiektu strefy czasowej wybranej przez użytkownika.

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

Większość kontrolek listy (takich jak kontrolka System.Windows.Forms.ListBox lub System.Web.UI.WebControls.BulletedList ) umożliwia przypisanie kolekcji zmiennych obiektów do ich DataSource właściwości, o ile kolekcja implementuje IEnumerable interfejs. (Klasa ogólna ReadOnlyCollection<T> robi to).) Aby wyświetlić pojedynczy obiekt w kolekcji, kontrolka wywołuje metodę tego obiektu ToString w celu wyodrębnienia ciągu używanego do reprezentowania obiektu. W przypadku TimeZoneInfo obiektów metoda zwraca TimeZoneInfo nazwę wyświetlaną obiektu (wartość jej DisplayNameToString właściwości).

Uwaga

Ponieważ kontrolki listy wywołają metodę obiektu ToString , można przypisać kolekcję TimeZoneInfo obiektów do kontrolki, mieć kontrolkę wyświetlającą zrozumiałą nazwę dla każdego obiektu i pobrać TimeZoneInfo obiekt wybrany przez użytkownika. Eliminuje to konieczność wyodrębnienia ciągu dla każdego obiektu w kolekcji, przypisania ciągu do kolekcji przypisanej do właściwości kontrolki DataSource , pobrania ciągu wybranego przez użytkownika, a następnie użycia tego ciągu do wyodrębnienia obiektu, który opisuje.

Kompilowanie kodu

Ten przykład wymaga:

Zobacz też