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

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

Примечание.

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

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

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

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

    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
    

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

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

  2. Назначьте коллекцию, возвращенную на шаге 1 DataSource свойству windows forms или элементу управления списком ASP.NET.

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

В этом примере показана иллюстрация для приложения Windows.

Пример

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

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

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

Примечание.

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

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

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

См. также