Отмена перехода на «зимнее» время
В связи с отменой перехода на «зимнее» время компании-разработчики задают нам вопросы, связанные с возможными проблемами, которые могут возникнуть с корректным функционированием приложений. Чтобы ответить на эти вопросы, мы подготовили данный материал, который содержит советы по корректному использованию функций работы датой/временем, проверке кода для поиска потенциальных проблем, а также описание шагов, которые необходимо выполнить для корректного развертывания обновления как операционной системы, так и самих приложений.
Ниже мы рассмотрим следующие темы:
- Подходы к тестированию приложений и проверке кода
- Рекомендации по корректной работе с датой/временем
- Подходы к поиску обновлений операционной системы
- Походы к обновлению приложений
- Дополнительные материалы
Введение
Летом этого года Правительство Российской Федерации приняло закон, отменяющий сезонный перевод часов и установило соответствующие часовые зоны и значения времени. «Летнее» и «зимнее» время, называемое также «сезонное время» или «сохраняющее световой день время» (DST – Daylight Saving Time) — это режим исчисления времени, при котором осуществляется перевод часов на один час вперед весной и на один час назад осенью.
Весенние и осенние переходы отличаются в Северном и Южном полушариях. Начало перехода на «летнее» время в Северном полушарии обычно приходится на март или апрель (в зависимости от страны и континента), а переход на «зимнее» время осуществляется в октябре или ноябре. В Южном полушарии все наоборот — «летнее» время начинается в октябре, а «зимнее» - в марте или апреле. Отметим, что переход на «летнее» и «зимнее» время происходит не во всех странах.
Тестирование приложения и проверка кода
Первый шаг при подготовке в отмене «зимнего» времени – это установка соответствующего обновления операционной системы, которое доступно по адресу http://support.microsoft.com/kb/2570791.
Далее, необходимо убедиться в том, что приложение корректно работает с новыми параметрами часовых поясов и отключенными настройками перехода на «зимнее» и «летнее» время. Для этого рекомендуется написать тестовый сценарий и сравнить результаты работы приложения на компьютере, где еще не установлено обновление и на компьютере с установленным обновлением.
В случае обнаружения проблем рекомендуется проверить код приложения, обращая внимание на следующие функциональные блоки:
- Получение или вычисление даты/времени
- Использование собственных алгоритмов проверки часового пояса, перехода на «зимнее» и «летнее» время
- Собственные вычисления временных диапазонов, например разниц дат в часах, минутах и секундах
- Вычисления, связанные с компенсацией переходов на «зимнее» и «летнее» время
- Преобразование представления даты/времени для хранения или отображения
Приведенные ниже рекомендации позволят минимизировать эффект отмены перехода на «зимнее» время и, в целом, улучшить работу с датой/временем в приложениях.
- При установке обновлений обращайте внимание на то, что обновления выполнялись последовательно, желательно последовательно, одно за другим
- Используйте дату/время, хранимое в UTC (всемирное координированное время, заменяет «устаревшее» среднее время по Гринвичу, GMT). Это представление аккуратно отображает исторические данные. В большинстве случаев проблемы возникают с преобразованием в локальное представление, т.к. в этом случае требуется получение информации о часовом поясе и DST (сохраняющее световой день время). Эта информация может быть получена из различных источников:
- Приложение может использовать текущий часовой пояс и настройки DST для выполнения преобразования. Это может привести к потерям точности в тех случаях, когда для получения даты/времени использовались другие настройки DST или часового пояса
- Приложение может хранить точную информацию о часовом поясе и DST в дополнение к дате/времени в UTC-формате
- При доступности динамических часовых поясов приложение может использовать их для определения, какая информация о часовом поясе должна быть применена к определенной дате/времени в формате UTC. Эта информация доступна только при доступности информации о динамическом часовом поясе для определенной дате/времени и для указанного часового пояса
- Приложение может сохранять дату/время как в локальном, так и в UTC-представлении – такой подход отменяет необходимость в выполнений последующих преобразований
- При реализации коммуникаций между компьютерами, включающие обмен датой/временем, должны выполняться в UTC-представлении – это дает обоим компьютерам одинаковую контекстную информацию для UTC
Ниже приведены некоторые сценарии использования функций работы с датой/временем, которые можно использовать для выполнения преобразований даты/времени в локальное представление.
Преобразование даты/времени в локальное представление
В операционной системе Microsoft Windows существует ряд программных интерфейсов, которые могут быть использованы для преобразования времени в формате UTC в локальное представление
- Функции GetSystemTime() и GetSystemTimeAsFileTime() возвращают время в формате UTC в структуре типа SYSTEMTIME или FILETIME
- Функция GetLocalTime() возвращает текущее локальное время в структуре типа SYSTEMTIME
- Функция GetTimeZoneInformation() возвращает структуру TIME _ ZONE _ INFORMATION, описывающую текущий часовой пояс и DST-настройки компьютера
- Функции SystemTimeToFileTime () и FileTimeToSystemTime () используются для преобразования данных в структурах типа SYSTEMTIME или FILETIME
- Функции FileTimeToLocalFileTime () и LocalFileTimeToFileTime () преобразовывают структуру FILETIME между UTC и локальным временем с учетом DST-настроек
- Функции SystemTimeToTzSpecificLocalTime () и TzSpecificTimeToSystemTime () преобразовывают UTC-дату/время в структуре SYSTEMTIME в локальную структуру SYSTEMTIME. Эти функции использую структуру TIME _ ZONE _ INFORMATION, которая описывает дату начала и окончания DST.
Начиная с операционной системы Microsoft Windows Vista введено понятие «динамических часовых поясов» - поддержки часовых поясов с «плавающими» от года к году датами начала/окончания DST. Правила определения даты начала/окончания сохраняются в реестре (см. ниже) и могут быть получены через функцию GetDynamicTimeZoneInformation () , которая заполняет структуру DYNAMIC _ TIME _ ZONE _ INFORMATION.
Использование .NET Framework
В .NET Framework существуют классы для преобразования даты/времени, к которым относятся классы DateTime, TimeZone, TimeSpan и DateTimeKind. Эти классы используют перечисленные выше функции Windows API. В дополнение к этим функциям, в .NET Framework есть функции изменения даты/времени на указанный промежуток – AddHours () , AddMinutes () , AddSeconds () , которые реализованы в классе DateTime.
Информация о часовых поясах
Как мы отметили выше, информация о часовых поясах хранится в реестре. Описания всех часовых поясов можно найти в следующей ветви реестра:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
Каждый часовой пояс имеет свой уникальный элемент, вложенные элементы которого содержат такие атрибуты, как название официальное часового пояса, формальное название, а также ссылки на мультиязычные ресурсы и, собственно информацию о часовом поясе.
Рис. Информация о часовом поясе в реестре
Вложенный элемент Dynamic DST содержит информацию о предыдущих изменениях часовых поясов. Начиная с операционной системы Windows Vista эта информация заполняется при установке операционной системы. Для операционных систем Windows XP и Windows Server 2003 информация заполняется при установке соответствующих пакетов обновления.
Рис. Информация о динамических часовых поясах в реестре
Информация о текущем часовом поясе, выбираемом в панели Date and Time также хранится в реестре в ветви
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation
Рис. Информация для панели Date and Time в реестре
Обратите внимание на то, что переход на летнее время отключен, т.к установлен пакет обновлений операционной системы.
Подходы к обновлению приложений
Компании, которые разрабатывают программные продукты, должны проверить корректность работы своих приложений после установки обновления (http://support.microsoft.com/kb/2570791), отменяющего автоматическое переключение Windows в режим «зимнего» времени. Процесс проверки описан выше. В случае необходимости, компании должны выпустить обновления своих продуктов, позволяющие корректно работать с датой/временем после 30.10.2011.
Поиск установленных обновлений
Для корректной установки обновлений своих продуктов необходимо убедиться, в том, что установлено само обновление операционной системы (KB2570791), т.к. не у всех пользователей включен механизм Windows Update и обновления операционной системы устанавливаются в момент их появления. Ниже описано несколько способов, позволяющих проверить факт установки обновления операционной системы (KB2570791).
Ручные способы
Для обнаружения факта установки обновления операционной системы (KB2570791) можно использовать раздел Windows Update в Control Panel. Для этого следует выполнить следующую последовательность действий:
- Вызывать меню Start
- Вызывать утилиту Control Panel
- Перейти в раздел Programs\Programs and Features\Installed Updates
- В списке установленных обновлений найти элемент Update for Microsoft Windows ( KB2570791) с датой 24.08.2011
Рис. Установленные обновления ОС в Control Panel
Для обнаружения факта установки обновления операционной системы (KB2570791) также можно использовать PowerShell. Для нахождения интересующего нас обновления операционной системы следует использовать стандартный командлет get- hotfix следующим образом:
PS C:\> get-hotfix KB2570791
Рис. Нахождение установленного обновления с помощью PowerShell
Информация об установленных обновлениях также доступна через унифицированный интерфейс управления операционной системой – Windows Management Instrumentation (WMI). Вручную это можно сделать с помощью утилиты Windows Management Instrumentation Console (WMIC). Для получения списка всех установленных обновлений следует выполнить команду
wmic qfe list
а для нахождения конкретного обновления операционной системы – команду
wmic qfe | find “2570791”
Рис. Нахождение установленного обновления с помощью PowerShell
Программные способы
Среди программных способов можно выделить поиск в реестре, использование уже упомянутого унифицированного интерфейса управления операционной системой –WMI и использование программных интерфейсов Windows Update. Поиск в реестре использовать не рекомендуется, так как в разных версиях операционной системы информация хранится в разных ветвях реестра, например, в последних версиях Windows используется раздел Component Based Update. Программные интерфейсы Windows Update достаточно сложны и их следует использовать в тех случаях, когда не подходят другие способы.
Наиболее простым способом программного обнаружения факта установки обновления операционной системы является интерфейс WMI. Для нахождения всех установленных обновлений необходимо выполнить запрос
select * from Win32_QuickFixEngineering
а для нахождения конкретного обновления - запрос
select * from Win32_QuickFixEngineering where HotFixID="KB2570791"
Рис. Выполнение WMI-запроса
Далее, если обновление операционной системы установлено, устанавливается обновление программного продукта компании-разработчика. Если же требуется установка обновления операционной системы, это можно сделать одним из следующих способов:
- Программно, через функции Component Based Servicing API
- Вместе с установкой обновления приложения – в этом случае все варианты обновления операционной системы должны распространяться на диске вместе с обновляемым приложением
- Вручную, через Windows Update – каждый пользователь должен самостоятельно выполнить установку обновлений операционной системы перед установкой обновленной версии приложения
- В случае, если механизм Windows Update не используется, обновления можно установить вручную, загрузив их по ссылке - http://support.microsoft.com/kb/2570791, выбрав требуемую версию операционной системы
Дополнительная информация
- Центр справки и поддержки по переходу на летнее и зимнее время
- Функции для работы с датой и временем – Windows API
- Структуры для работы с датой и временем – Windows API
- Использование классов .NET Framework
- Описание Windows Management Instrumentation
- Программные интерфейсы Component Based Servicing
/АФ