• Статья
  • Чтение занимает 2 мин

TimeZoneInfoКласс упрощает создание приложений, поддерживающих Часовые пояса. TimeZoneКласс поддерживает работу с местным часовым поясом и временем в формате UTC. TimeZoneInfoКласс поддерживает обе эти зоны, а также любой часовой пояс, сведения о котором предопределены в реестре. Также можно использовать TimeZoneInfo для определения пользовательских часовых поясов, о которых в системе нет сведений.

Основные сведения о часовых поясах

Часовой пояс — это географическая область, в которой действует одно и то же время. Обычно, но не всегда, соседние часовые пояса отличаются друг от друга на один час. Время в любом из мировых часовых поясов может быть выражено в виде смещения относительно универсального синхронизированного времени (UTC).

Во многих мировых часовых поясах поддерживается переход на летнее время. Переход на летнее время позволяет увеличить количество светлого времени суток за счет перевода времени на один час вперед весной или ранним летом и возврата к обычному (или стандартному) времени поздним летом или осенью. Такие переходы к стандартному времени и с него называются правилами коррекции.

Переход на летнее время и с него в определенном часовом поясе может быть определен с помощью фиксированного или плавающего правила коррекции. Фиксированное правило коррекции задает определенную дату, в которую ежегодно происходит переход на летнее или на зимнее время. Например, ежегодный переход на зимнее время 25 октября следует фиксированному правилу коррекции. Гораздо более общими являются плавающие правила коррекции, которые задают определенные день, неделю и месяц для перехода на зимнее или на летнее время. Например, переход на летнее время, который происходит каждое третье воскресенье марта, следует плавающему правилу коррекции.

Для часовых поясов, поддерживающих правила коррекции, переход на летнее время и с него создает два вида аномальных времен: недопустимые времена и неоднозначные времена. Недопустимое время — это несуществующее значение времени, созданное в результате перехода со стандартного времени на летнее время. Например, если такой переход происходит в указанный день в 2:00 утра и вызывает время изменения до 3:00 утра, то каждый раз интервал между 2:00 утра и 2:59:99 утра является недопустимым. Неоднозначное время — это время, которому могут соответствовать два различных времени в одном часовом поясе. Оно создается при переходе с летнего времени на зимнее время. Например, если такой переход происходит в указанный день в 2:00 утра и вызывает время изменения до 1:00 утра, то каждый раз интервал между 1:00 утра и 1:59:99 утра может быть интерпретирован как стандартное или как летнее время.

Терминология часовых поясов

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

Термин Определение
Правило коррекции Правило, определяющее момент перехода со стандартного времени на летнее время и обратно. Каждое правило коррекции имеет начальную и конечную даты, определяющие, когда правило установлено (например, правило коррекции принимается с 1 января 1986 года по 31 декабря 2006), Дельта (время, на которое стандартное время изменяется в результате применения правила коррекции), а также сведения о конкретной дате и времени, когда переходы выполняются в течение периода корректировки. Переходы могут следовать фиксированному или плавающему правилу.
Неоднозначное время Время, которому могут соответствовать два различных времени в одном часовом поясе. Это происходит, когда часы переводятся назад, как при переходе в одном часовом поясе с летнего времени на его стандартное время. Например, если такой переход происходит в указанный день в 2:00 утра и вызывает время изменения до 1:00 утра, то каждый раз интервал между 1:00 утра и 1:59:99 утра может быть интерпретирован как стандартное или как летнее время.
Фиксированное правило Правило коррекции, которое устанавливает определенную дату для перехода на летнее или зимнее время. Например, ежегодный переход на зимнее время 25 октября следует фиксированному правилу коррекции.
Плавающее правило Правило коррекции, которое устанавливает определенные день, неделю и месяц для перехода на летнее или на зимнее время. Например, переход на летнее время, который происходит каждое третье воскресенье марта, следует плавающему правилу коррекции.
Недопустимое время Несуществующее время, возникающее в результате перехода со стандартного на летнее время. Это происходит, когда время часов переводится вперед, как при переходе в одном часовом поясе с зимнего на летнее время. Например, если такой переход происходит в указанный день в 2:00 утра и вызывает время изменения до 3:00 утра, то каждый раз интервал между 2:00 утра и 2:59:99 утра является недопустимым.
Время перехода Сведения о конкретном изменении времени определенного часового пояса, такие как изменение летнего времени на зимнее или наоборот.

Часовые пояса и класс TimeZoneInfo

В .NET TimeZoneInfo объект представляет часовой пояс. TimeZoneInfoКласс включает GetAdjustmentRules метод, возвращающий массив TimeZoneInfo.AdjustmentRule объектов. Каждый элемент этого массива содержит сведения о переходе на летнее время в течение определенного периода времени и обратно. (Для часовых поясов, которые не поддерживают переход на летнее время, метод возвращает пустой массив.) Каждый TimeZoneInfo.AdjustmentRule объект имеет DaylightTransitionStart DaylightTransitionEnd свойство и, которое определяет конкретную дату и время перехода на летнее время и обратно. IsFixedDateRuleСвойство указывает, является ли переход фиксированным или плавающим.

.net использует сведения о часовом поясе, предоставляемые операционной системой Windows и хранимые в реестре. Из-за количества часовых поясов Земли не все существующие Часовые пояса представлены в реестре. Кроме того, поскольку реестр является динамической структурой, стандартные часовые пояса можно добавлять в него или удалять из него. Наконец, реестр не обязательно должен содержать исторические данные часового пояса. например, в Windows XP реестр содержит данные только об одном наборе корректировок часового пояса. Windows Vista поддерживает динамические данные часового пояса. Это означает, что один часовой пояс может иметь несколько правил коррекции, которые применяются к определенным интервалам в годах. однако большинство часовых поясов, определенных в реестре Windows Vista и поддерживающем переход на летнее время, имеют только одно или два предопределенные правила коррекции.

Зависимость TimeZoneInfo класса от реестра означает, что приложение, поддерживающее Часовые пояса, не может быть уверенным в том, что в реестре определен определенный часовой пояс. В результате при попытке создать экземпляр определенного часового пояса (отличного от местного часового пояса или часового пояса, представляющего UTC) следует использовать обработку исключений. Кроме того, он должен предоставить возможность продолжить работу приложения, если TimeZoneInfo не удается создать экземпляр требуемого объекта из реестра.

Для решения отсутствия необходимого часового пояса TimeZoneInfo класс включает CreateCustomTimeZone метод, который можно использовать для создания пользовательских часовых поясов, не найденных в реестре. Дополнительные сведения о создании настраиваемого часового пояса см. в разделе как создать часовой пояс без правил коррекции и как создать Часовые пояса с правилами коррекции. Кроме того, можно использовать ToSerializedString метод для преобразования только что созданного часового пояса в строку и его сохранения в хранилище данных (например, в базе данных, текстовом файле, реестре или ресурсе приложения). Затем можно использовать FromSerializedString метод для преобразования этой строки обратно в TimeZoneInfo объект. Дополнительные сведения см. в разделе как сохранить Часовые пояса во внедренном ресурсе и как восстановить Часовые пояса из внедренного ресурса.

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

  • ConvertTimeFromUtc, который преобразует время в формате UTC в заданный часовой пояс.

  • ConvertTimeToUtc, который преобразует время в заданном часовом поясе в формате UTC.

  • ConvertTime, который преобразует время в одном указанном часовом поясе во время в другом заданном часовом поясе.

  • ConvertTimeBySystemTimeZoneId, которая использует идентификаторы часовых поясов (вместо TimeZoneInfo объектов) в качестве параметров для преобразования времени в одном заданном часовом поясе во время в другом заданном часовом поясе.

Дополнительные сведения о преобразовании времени между часовыми поясами см. в разделе Преобразование времени из одного часового пояса в другой.

См. также

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