Поделиться через


Практическое руководство. Перечисление присутствующих на компьютере часовых поясов

Для успешной работы с указанным часовым поясом необходимо, чтобы сведения об этом часовом поясе были доступны в системе. В операционных системах Windows XP и Windows Vista эти сведения хранятся в реестре. Тем не менее, хотя общее число часовых поясов, которые существуют по всему миру, велико, реестр содержит сведения только о подмножестве из них. Кроме того, реестр сам является динамической структурой, содержимое которой подвержено преднамеренным и случайным изменениям. В итоге приложение не может всегда предполагать, что определенный часовой пояс определен и доступен в системе. Первым шагом для многих приложений, использующих данные о часовых поясах, является определение доступности требуемого часового пояса на локальном компьютере или предоставление пользователю списка часовых поясов для выбора. Для этого необходимо, чтобы приложение перечислило часовые пояса, определенные в локальной системе.

ПримечаниеПримечание

Если приложение полагается на наличие определенного часового пояса, который может быть не определен в локальной системе, то приложение может проверить его наличие, сериализовав и десериализовав данные о часовом поясе.Затем часовой пояс может быть добавлен в элемент управления "список" и выбран пользователем.Дополнительные сведения см. в разделах Практическое руководство. Сохранение часовых поясов во внедренном ресурсе и Практическое руководство. Восстановление часовых поясов из внедренного ресурса.

Перечисление часовых поясов, присутствующих в локальной системе

  1. Вызовите метод TimeZoneInfo.GetSystemTimeZones. Этот метод возвращает универсальную коллекцию ReadOnlyCollection<T> объектов TimeZoneInfo. Элементы коллекции сортируются по свойству DisplayName. Пример:

    Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones
    
    ReadOnlyCollection<TimeZoneInfo> tzCollection;
    tzCollection = TimeZoneInfo.GetSystemTimeZones();
    
  2. Перечислите отдельные объекты TimeZoneInfo в коллекции с помощью цикла foreach (в C#) или цикла For Each…Next (в Visual Basic) и выполните все необходимые действия с каждым объектом. Например, следующий код перечисляет коллекцию ReadOnlyCollection<T> объектов TimeZoneInfo, возвращенную на шаге 1, и выводит на консоль список отображаемых имен всех часовых поясов.

    For Each timeZone As TimeZoneInfo In tzCollection
       Console.WriteLine("   {0}: {1}", timeZone.Id, timeZone.DisplayName)
    Next
    
    foreach (TimeZoneInfo timeZone in tzCollection)
       Console.WriteLine("   {0}: {1}", timeZone.Id, timeZone.DisplayName);
    

Предоставление пользователю списка часовых поясов, присутствующих в локальной системе

  1. Вызовите метод TimeZoneInfo.GetSystemTimeZones. Этот метод возвращает универсальную коллекцию ReadOnlyCollection<T> объектов TimeZoneInfo.

  2. Присвойте коллекцию, возвращенную на шаге 1, свойству DataSource элемента управления "список" Windows Forms или ASP.NET.

  3. Получите выбранный пользователем объект TimeZoneInfo.

Пример показывает это на основе приложения Windows.

Пример

В примере запускается приложение Windows, которое отображает в списке часовые пояса, определенные в системе. Затем выводится диалоговое окно, содержащее значение свойства DisplayName объекта часового пояса, выбранного пользователем.

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
private void Form1_Load(object sender, EventArgs e)
{
   ReadOnlyCollection<TimeZoneInfo> tzCollection; 
   tzCollection = TimeZoneInfo.GetSystemTimeZones();
   this.timeZoneList.DataSource = tzCollection;
}

private void OkButton_Click(object sender, EventArgs e)
{
   TimeZoneInfo selectedTimeZone = (TimeZoneInfo) this.timeZoneList.SelectedItem;
   MessageBox.Show("You selected the " + selectedTimeZone.ToString() + " time zone.");
}

Большинство элементов управления "список" (таких как элементы управления System.Windows.Forms.ListBox или System.Web.UI.WebControls.BulletedList) позволяют присвоить коллекцию объектов их свойству DataSource, если коллекция реализует интерфейс IEnumerable. (Это реализуется с помощью универсального класса ReadOnlyCollection<T>.) Чтобы отобразить отдельный объект коллекции, элемент управления вызывает метод объекта ToString для извлечения строки, которая используется для представления объекта. Для объектов TimeZoneInfo метод ToString возвращает отображаемое имя объекта TimeZoneInfo (значение его свойства DisplayName).

ПримечаниеПримечание

Поскольку элемент управления "список" вызывает метод объекта ToString, то можно присвоить коллекцию объектов TimeZoneInfo элементу управления, отображать понятное имя каждого объекта и получать выбранный пользователем объект TimeZoneInfo.Это избавляет от необходимости извлекать строку для каждого объекта в коллекции, присваивать этой строке коллекции, которая, в свою очередь, присваивается свойству DataSource элемента управления, получать строку, которую выбрал пользователь, и затем использовать данную строку для получения объекта, который она описывает.

Компиляция кода

Для этого примера требуется:

  • Чтобы ссылка на System.Core.dll была добавлена в проект.

  • Чтобы был осуществлен импорт следующих пространств имен:

    System (в коде C#)

    System.Collections.ObjectModel

См. также

Задачи

Практическое руководство. Сохранение часовых поясов во внедренном ресурсе

Практическое руководство. Восстановление часовых поясов из внедренного ресурса

Другие ресурсы

Даты, время и часовые пояса