Общие сведения о часовых поясах
Класс TimeZoneInfo упрощает создание приложений с поддержкой часового пояса. Класс TimeZone поддерживает работу с локальным часовом поясом и согласованным универсальным временем (UTC). Класс TimeZoneInfo поддерживает обе эти зоны, а также любой часовой пояс о том, какие сведения предопределены в реестре. Можно также использовать TimeZoneInfo для определения пользовательских часовых поясов, о том, что в системе нет сведений.
Основные сведения о часовом поясе
Часовой пояс — это географическая область, в которой действует одно и то же время. Обычно, но не всегда, соседние часовые пояса отличаются друг от друга на один час. Время в любом из мировых часовых поясов может быть выражено в виде смещения относительно универсального синхронизированного времени (UTC).
Во многих мировых часовых поясах поддерживается переход на летнее время. Переход на летнее время позволяет увеличить количество светлого времени суток за счет перевода времени на один час вперед весной или ранним летом и возврата к обычному (или стандартному) времени поздним летом или осенью. Такие переходы к стандартному времени и с него называются правилами коррекции.
Переход на летнее время и с него в определенном часовом поясе может быть определен с помощью фиксированного или плавающего правила коррекции. Фиксированное правило коррекции задает определенную дату, в которую ежегодно происходит переход на летнее или на зимнее время. Например, ежегодный переход на зимнее время 25 октября следует фиксированному правилу коррекции. Гораздо более общими являются плавающие правила коррекции, которые задают определенные день, неделю и месяц для перехода на зимнее или на летнее время. Например, переход на летнее время, который происходит каждое третье воскресенье марта, следует плавающему правилу коррекции.
Для часовых поясов, поддерживающих правила коррекции, переход на летнее время и с него создает два вида аномальных времен: недопустимые времена и неоднозначные времена. Недопустимое время — это несуществующее значение времени, созданное в результате перехода со стандартного времени на летнее время. Например, если этот переход происходит в определенный день в 2:00 утра и вызывает изменение времени на 3:00 утра, каждый интервал времени между 2:00 утра и 2:59:59 A.M. недопустим. Неоднозначное время — это время, которому могут соответствовать два различных времени в одном часовом поясе. Оно создается при переходе с летнего времени на зимнее время. Например, если этот переход происходит в определенный день в 2:00 утра и вызывает изменение времени на 1:00 утра, каждый интервал времени между 1:00 утра и 1:59:59 A.M. может быть интерпретирован как стандартное время или летнее время.
Терминология часового пояса
В таблице ниже представлены распространенные термины, используемые при работе с часовыми поясами и разработке приложений, работающих с часовыми поясами.
Термин | Определение |
---|---|
Правило коррекции | Правило, определяющее момент перехода со стандартного времени на летнее время и обратно. Каждое правило корректировки имеет дату начала и окончания, которая определяет, когда правило находится на месте (например, правило корректировки выполняется с 1 января 1986 г. по 31 декабря 2006 г.), разностное значение (время, на которое изменяется стандартное время в результате применения правила корректировки), а также сведения о конкретной дате и времени, в течение которого переходы происходят в течение периода корректировки. Переходы могут следовать фиксированному или плавающему правилу. |
Неоднозначное время | Время, которому могут соответствовать два различных времени в одном часовом поясе. Это происходит, когда часы переводятся назад, как при переходе в одном часовом поясе с летнего времени на его стандартное время. Например, если этот переход происходит в определенный день в 2:00 утра и вызывает изменение времени на 1:00 утра, каждый интервал времени между 1:00 утра и 1:59:59 A.M. может быть интерпретирован как стандартное время или летнее время. |
Фиксированное правило | Правило коррекции, которое устанавливает определенную дату для перехода на летнее или зимнее время. Например, ежегодный переход на зимнее время 25 октября следует фиксированному правилу коррекции. |
Плавающее правило | Правило коррекции, которое устанавливает определенные день, неделю и месяц для перехода на летнее или на зимнее время. Например, переход на летнее время, который происходит каждое третье воскресенье марта, следует плавающему правилу коррекции. |
Недопустимое время | Несуществующее время, возникающее в результате перехода со стандартного на летнее время. Это происходит, когда время часов переводится вперед, как при переходе в одном часовом поясе с зимнего на летнее время. Например, если этот переход происходит в определенный день в 2:00 утра и вызывает изменение времени на 3:00 утра, каждый интервал времени между 2:00 утра и 2:59:59 A.M. недопустим. |
Время перехода | Сведения о конкретном изменении времени определенного часового пояса, такие как изменение летнего времени на зимнее или наоборот. |
Часовые пояса и класс TimeZoneInfo
В .NET TimeZoneInfo объект представляет часовой пояс. Класс TimeZoneInfo включает GetAdjustmentRules метод, возвращающий массив TimeZoneInfo.AdjustmentRule объектов. Каждый элемент этого массива содержит сведения о переходе на летнее время и из них в определенный период времени. (Для часовых поясов, не поддерживающих летнее время, метод возвращает пустой массив.) У каждого TimeZoneInfo.AdjustmentRule объекта есть DaylightTransitionStart свойство, DaylightTransitionEnd определяющее определенную дату и время перехода на летнее время и с летнего времени. Свойство IsFixedDateRule указывает, является ли переход фиксированным или плавающим.
Платформа .NET использует сведения часового пояса, предоставляемые операционной системой Windows и хранящиеся в реестре. Из-за количества часовых поясов земли в реестре представлены не все существующие часовые пояса. Кроме того, так как реестр представляет собой динамическую структуру, предопределенные часовые пояса можно добавить или удалить из него. Наконец, реестр не обязательно содержит исторические данные часового пояса. Например, в Windows XP реестр содержит данные только о одном наборе корректировки часового пояса. Windows Vista поддерживает динамические данные часового пояса, что означает, что один часовой пояс может иметь несколько правил корректировки, которые применяются к определенным интервалам года. Однако большинство часовых поясов, определенных в реестре Windows Vista и поддерживающие летнее время, имеют только одно или два предопределенных правила корректировки.
Зависимость TimeZoneInfo класса от реестра означает, что приложение, поддерживающее часовой пояс, не может быть уверены, что определенный часовой пояс определен в реестре. В результате при попытке создать экземпляр определенного часового пояса (отличного от местного часового пояса или часового пояса, представляющего UTC) следует использовать обработку исключений. Он также должен предоставить некоторый метод, позволяющий приложению продолжать работу, если обязательный TimeZoneInfo объект не может быть создан из реестра.
Для обработки отсутствия необходимого часового пояса класс включает CreateCustomTimeZone метод, TimeZoneInfo который можно использовать для создания пользовательских часовых поясов, которые не найдены в реестре. Дополнительные сведения о создании пользовательского часового пояса см. в статье "Практическое руководство. Создание часовых поясов без правил корректировки и практическое руководство. Создание часовых поясов с правилами корректировки". Кроме того, можно использовать ToSerializedString метод для преобразования созданного часового пояса в строку и сохранения его в хранилище данных (например, в базе данных, текстовом файле, реестре или ресурсе приложения). Затем можно использовать FromSerializedString метод для преобразования этой строки обратно в TimeZoneInfo объект. Дополнительные сведения см. в статье "Практическое руководство. Сохранение часовых поясов в внедренном ресурсе и практическое руководство. Восстановление часовых поясов из внедренного ресурса".
Поскольку каждый часовой пояс характеризуется базовым смещением относительно UTC, а также смещением относительно времени UTC, которое отражает любые существующие правила коррекции, время в одном часовом поясе может быть легко преобразовано во время в другом часовом поясе. Для этого TimeZoneInfo объект включает несколько методов преобразования, в том числе:
ConvertTimeFromUtc, который преобразует UTC в время в заданном часовом поясе.
ConvertTimeToUtc, который преобразует время в указанном часовом поясе в формате UTC.
ConvertTime, который преобразует время в одном заданном часовом поясе в время в другом заданном часовом поясе.
ConvertTimeBySystemTimeZoneId, который использует идентификаторы часового пояса TimeZoneInfo (вместо объектов) в качестве параметров для преобразования времени в одном заданном часовом поясе в время в другой назначенный часовой пояс.
Дополнительные сведения о преобразовании времени между часовыми поясами см. в разделе Преобразование времени из одного часового пояса в другой.