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


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

Класс 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 Framework объект TimeZoneInfo представляет часовой пояс. Класс TimeZoneInfo содержит метод GetAdjustmentRules, который возвращает массив объектов TimeZoneInfo.AdjustmentRule. Каждый элемент этого массива предоставляет сведения о переходе на летнее время и с него за определенный период времени. (Для часовых поясов, которые не поддерживают переход на летнее время, метод возвращает пустой массив.) Каждый объект TimeZoneInfo.AdjustmentRule имеет свойства DaylightTransitionStart и DaylightTransitionEnd, которые определяют конкретные дату и время для перехода на летнее время и с летнего времени. Свойство IsFixedDateRule указывает, является ли этот переход фиксированным или плавающим.

.NET Framework полагается на сведения часовых поясов, предоставляемые операционной системой 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) в качестве своих параметров для преобразования времени из одного заданного часового пояса во время в другом заданном часовом поясе.

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

См. также

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

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