Отмена перехода на «зимнее» время

В связи с отменой перехода на «зимнее» время компании-разработчики задают нам вопросы, связанные с возможными проблемами, которые могут возникнуть с корректным функционированием приложений. Чтобы ответить на эти вопросы, мы подготовили данный материал, который содержит советы по корректному использованию функций работы датой/временем, проверке кода для поиска потенциальных проблем, а также описание шагов, которые необходимо выполнить для корректного развертывания обновления как операционной системы, так и самих приложений.

Ниже мы рассмотрим следующие темы:

  • Подходы к тестированию приложений и проверке кода
  • Рекомендации по корректной работе с датой/временем
  • Подходы к поиску обновлений операционной системы
  • Походы к обновлению приложений
  • Дополнительные материалы

Введение

Летом этого года Правительство Российской Федерации приняло закон, отменяющий сезонный перевод часов и установило соответствующие часовые зоны и значения времени. «Летнее» и «зимнее» время, называемое также «сезонное время» или «сохраняющее световой день время» (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

Каждый часовой пояс имеет свой уникальный элемент, вложенные элементы которого содержат такие атрибуты, как название официальное часового пояса, формальное название, а также ссылки на мультиязычные ресурсы и, собственно информацию о часовом поясе.

clip_image002

Рис. Информация о часовом поясе в реестре

Вложенный элемент Dynamic DST содержит информацию о предыдущих изменениях часовых поясов. Начиная с операционной системы Windows Vista эта информация заполняется при установке операционной системы. Для операционных систем Windows XP и Windows Server 2003 информация заполняется при установке соответствующих пакетов обновления.

clip_image004

Рис. Информация о динамических часовых поясах в реестре

Информация о текущем часовом поясе, выбираемом в панели Date and Time также хранится в реестре в ветви

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation

clip_image006

Рис. Информация для панели 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

clip_image008

Рис. Установленные обновления ОС в Control Panel

Для обнаружения факта установки обновления операционной системы (KB2570791) также можно использовать PowerShell. Для нахождения интересующего нас обновления операционной системы следует использовать стандартный командлет get- hotfix следующим образом:

PS C:\> get-hotfix KB2570791

clip_image010

Рис. Нахождение установленного обновления с помощью PowerShell

Информация об установленных обновлениях также доступна через унифицированный интерфейс управления операционной системой – Windows Management Instrumentation (WMI). Вручную это можно сделать с помощью утилиты Windows Management Instrumentation Console (WMIC). Для получения списка всех установленных обновлений следует выполнить команду

wmic qfe list

а для нахождения конкретного обновления операционной системы – команду

wmic qfe | find “2570791”

clip_image012

Рис. Нахождение установленного обновления с помощью PowerShell

Программные способы

Среди программных способов можно выделить поиск в реестре, использование уже упомянутого унифицированного интерфейса управления операционной системой –WMI и использование программных интерфейсов Windows Update. Поиск в реестре использовать не рекомендуется, так как в разных версиях операционной системы информация хранится в разных ветвях реестра, например, в последних версиях Windows используется раздел Component Based Update. Программные интерфейсы Windows Update достаточно сложны и их следует использовать в тех случаях, когда не подходят другие способы.

Наиболее простым способом программного обнаружения факта установки обновления операционной системы является интерфейс WMI. Для нахождения всех установленных обновлений необходимо выполнить запрос

select * from Win32_QuickFixEngineering

а для нахождения конкретного обновления - запрос

select * from Win32_QuickFixEngineering where HotFixID="KB2570791"

 

image

Рис. Выполнение WMI-запроса

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

  • Программно, через функции Component Based Servicing API
  • Вместе с установкой обновления приложения – в этом случае все варианты обновления операционной системы должны распространяться на диске вместе с обновляемым приложением
  • Вручную, через Windows Update – каждый пользователь должен самостоятельно выполнить установку обновлений операционной системы перед установкой обновленной версии приложения
  • В случае, если механизм Windows Update не используется, обновления можно установить вручную, загрузив их по ссылке - http://support.microsoft.com/kb/2570791, выбрав требуемую версию операционной системы

 

Дополнительная информация

/АФ