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

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

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

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

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

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

📎📎📎📎📎📎📎📎📎📎