Microsoft corporate blog
October 2011 18

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

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

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

Введение


Летом этого года Правительство Российской Федерации приняло закон, отменяющий сезонный перевод часов и установило соответствующие часовые зоны и значения времени. «Летнее» и «зимнее» время, называемое также «сезонное время» или «сохраняющее световой день время» (DST – Daylight Saving Time) — это режим исчисления времени, при котором осуществляется перевод часов на один час вперед весной и на один час назад осенью. Весенние и осенние переходы отличаются в Северном и Южном полушариях. Начало перехода на «летнее» время в Северном полушарии обычно приходится на март или апрель (в зависимости от страны и континента), а переход на «зимнее» время осуществляется в октябре или ноябре. В Южном полушарии все наоборот — «летнее» время начинается в октябре, а «зимнее» — в марте или апреле. Отметим, что переход на «летнее» и «зимнее» время происходит не во всех странах.

Тестирование приложения и проверка кода


Первый шаг при подготовке в отмене «зимнего» времени – это установка соответствующего обновления операционной системы, которое доступно по адресу http://support.microsoft.com/kb/2570791. Далее, необходимо убедиться в том, что приложение корректно работает с новыми параметрами часовых поясов и отключенными настройками перехода на «зимнее» и «летнее» время. Для этого рекомендуется написать тестовый сценарий и сравнить результаты работы приложения на компьютере, где еще не установлено обновление и на компьютере с установленным обновлением. В случае обнаружения проблем рекомендуется проверить код приложения, обращая внимание на следующие функциональные блоки:
  • Получение или вычисление даты/времени
  • Использование собственных алгоритмов проверки часового пояса, перехода на «зимнее» и «летнее» время
  • Собственные вычисления временных диапазонов, например разниц дат в часах, минутах и секундах
  • Вычисления, связанные с компенсацией переходов на «зимнее» и «летнее» время
  • Преобразование представления даты/времени для хранения или отображения
Приведенные ниже рекомендации позволят минимизировать эффект отмены перехода на «зимнее» время и, в целом, улучшить работу с датой/временем в приложениях.
  • При установке обновлений обращайте внимание на то, что обновления выполнялись последовательно, желательно последовательно, одно за другим
  • Используйте дату/время, хранимое в UTC (всемирное координированное время, заменяет «устаревшее» среднее время по Гринвичу, GMT). Это представление аккуратно отображает исторические данные. В большинстве случаев проблемы возникают с преобразованием в локальное представление, т.к. в этом случае требуется получение информации о часовом поясе и DST (сохраняющее световой день время). Эта информация может быть получена из различных источников:
  • При реализации коммуникаций между компьютерами, включающие обмен датой/временем, должны выполняться в 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

Подходы к обновлению приложений


Компании, которые разрабатывают программные продукты, должны проверить корректность работы своих приложений после установки обновления (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

Для обнаружения факта установки обновления операционной системы (KB2570791) также можно использовать PowerShell. Для нахождения интересующего нас обновления операционной системы следует использовать стандартный командлет get-hotfix следующим образом: PS C:\> get-hotfix KB2570791
Информация об установленных обновлениях также доступна через унифицированный интерфейс управления операционной системой – Windows Management Instrumentation (WMI). Вручную это можно сделать с помощью утилиты Windows Management Instrumentation Console (WMIC). Для получения списка всех установленных обновлений следует выполнить команду wmic qfe list а для нахождения конкретного обновления операционной системы – команду
wmic qfe | find “2570791”

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

Среди программных способов можно выделить поиск в реестре, использование уже упомянутого унифицированного интерфейса управления операционной системой –WMI и использование программных интерфейсов Windows Update. Поиск в реестре использовать не рекомендуется, так как в разных версиях операционной системы информация хранится в разных ветвях реестра, например, в последних версиях Windows используется раздел Component Based Update. Программные интерфейсы Windows Update достаточно сложны и их следует использовать в тех случаях, когда не подходят другие способы.
Наиболее простым способом программного обнаружения факта установки обновления операционной системы является интерфейс WMI. Для нахождения всех установленных обновлений необходимо выполнить запрос
select * from Win32_QuickFixEngineering а для нахождения конкретного обновления — запрос select * from Win32_QuickFixEngineering where HotFixID="KB2570791"
Далее, если обновление операционной системы установлено, устанавливается обновление программного продукта компании-разработчика. Если же требуется установка обновления операционной системы, это можно сделать одним из следующих способов:
  • Программно, через функции 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
/АФ
+11
45.9k 19
Comments 17