Практическое руководство. Перечисление часовых поясов на компьютере
Для успешной работы с указанным часовым поясом необходимо, чтобы сведения об этом часовом поясе были доступны в системе. Операционные системы Windows XP и Windows Vista хранят эти сведения в реестре. Тем не менее, хотя общее число часовых поясов, которые существуют по всему миру, велико, реестр содержит сведения только о подмножестве из них. Кроме того, реестр сам является динамической структурой, содержимое которой подвержено преднамеренным и случайным изменениям. В итоге приложение не может всегда предполагать, что конкретный часовой пояс определен и доступен в системе. Первым шагом для многих приложений, использующих данные о часовых поясах, является определение доступности требуемого часового пояса на локальном компьютере или предоставление пользователю списка часовых поясов для выбора. Для этого необходимо, чтобы приложение перечислило часовые пояса, определенные в локальной системе.
Примечание.
Если приложение зависит от наличия определенного часового пояса, который не может быть определен в локальной системе, приложение может обеспечить его присутствие путем сериализации и десериализации сведений о часовом поясе. Затем часовой пояс можно добавить в элемент управления списком, чтобы пользователь приложения смог выбрать его. Дополнительные сведения см. в статье "Практическое руководство. Сохранение часовых поясов в внедренном ресурсе и практическое руководство. Восстановление часовых поясов из внедренного ресурса".
Перечисление часовых поясов, присутствующих в локальной системе
Вызовите метод TimeZoneInfo.GetSystemTimeZones . Метод возвращает универсальную ReadOnlyCollection<T> коллекцию TimeZoneInfo объектов. Записи в коллекции отсортированы по их DisplayName свойству. Например:
ReadOnlyCollection<TimeZoneInfo> tzCollection; tzCollection = TimeZoneInfo.GetSystemTimeZones();
Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones
Перечисление отдельных 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
Представление пользователя со списком часовых поясов, присутствующих в локальной системе
Вызовите метод TimeZoneInfo.GetSystemTimeZones . Метод возвращает универсальную ReadOnlyCollection<T> коллекцию TimeZoneInfo объектов.
Назначьте коллекцию, возвращенную на шаге 1
DataSource
свойству windows forms или элементу управления списком ASP.NET.Получите объект, выбранный 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
, получить строку, выбранную пользователем, а затем использовать эту строку для извлечения объекта, который он описывает.
Компиляция кода
Для этого примера требуются:
Импортируются следующие пространства имен:
System (в коде C#)