company_banner

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

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

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

    Введение


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

    Comments 17

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

      * Используйте дату/время, хранимое в UTC

      А разве в ОС Windows по умолчанию не локальное время хранится и читается из BIOS? Да ещё и пишется туда обратно, если переводишь время или даже меняешь таймзону. Или рекомендации по улучшению сюда не относятся?)
        –1
        То, что делает ОС не имеет отношения к работе приложений. Да и целью статьи не было рассказать, как устроена Windows
          0
          Переосмыслив вопрос: время в системе всегда локальное, речь идет о способе его хранения и представления внутри приложения. BIOS к этому отношения не имеет, т.к. ничего не знает ни про ОС, ни про часовые пояса и т.п.
            +1
            Только что слышал по радио, что наши дебилята подумывают отменить свое решение об отмене зимного времени. Надеюсь таки будем жить в своем натуральном часовом поясе +2.
              0
              Вообще, что +2, что +3 одинаково странно выглядят. С одной стороны Украина на 95% географически в зоне пояса +2, с другой — если зафиксировать +2, разница с Россией при пересечении границы составит 2 часа, что странновато.
                +2
                Не отменили.
                Тут пользователи украины задают другой вопрос микрософту
                какого… Патч выйде только в декабре???
                У нас что супер маленькая страна?
                Или миллионы пользователей должны ручками указывать время Калининграда как вы рекомендуете?
                  +1
                  Ну вот что-то вы выходит знали, :) рада отменила свою постанову, и мы переходим на зимнее время, надеюсь там и останемся и больше переходить не будем.
                  0
                  На России клин светом не сошелся, любители ездить в Европу видят не менее странной двухчасовую разницу между +1 и +3.
                  А если взять те 5%, которые не попадают в часовой пояс +2, то вообще весело. Вон в закарпатье жалуются на рассвет, который будет начинаться в 10 часов утра.
                –2
                В любом случае материал полезный — написано, какое обновление ответчает за отключение перехода на «зимнее» время и как его найти. Так что не нужно будет сносить все :)
                  +2
                  Лучше скажите, за что так (kb2625508) с Украиной поступили.
                    0
                    Самая ценная часть данного поста — это способы получения информации об установленных обновлениях. За это отдельное спасибо.
                      0
                      Еще можно в журнале посмотреть — файл %SYSTEMROOT%\WindowsUpdate.log
                        0
                        Это не смешно и не юзабельно, когда надо в срок их поставить…
                        0
                        Бугага! Только что наши депутаты «отменили отмену» — теперь на Украине будет как и раньне летнее и зимнее время:
                        podrobnosti.ua/power/2011/10/18/798422.html
                        Правильно сделал майкрософт что не стал торопиться с апдейтом.
                          +2
                          Просто депутаты ненавидят линуксоидов, уже внесших исправление в таймзону.
                          +1
                          раз уж подняли эту тему, то может хоть сейчас мне ответят на мой камент в другой теме

                          если кому лень ходить — простенькой прогой на С# выгребаем инфу о таймзонах. находим среди них российские. и получаем некую фигню

                          По версии MS начина с 01.01.2011 все часовые пояса в России ликвидируются!
                          А до того никогда не переходили на летнее/зимнее время

                          Примеры? Пожалуйста

                          Было:
                          Russian Standard Time|Winter: 03:00:00|Summer: 04:00:00
                          01.01.0001 0:00:00|31.12.9999 0:00:00|01:00:00|3/1/Sunday|10/1/Sunday

                          Стало после августовского обновления:
                          Russian Standard Time|(UTC+04:00) Волгоград, Москва, Санкт-Петербург|Winter: 04:00:00|Summer: 04:00:00
                          01.01.0001 0:00:00|31.12.2010 0:00:00|01:00:00|3/1/Sunday|10/1/Sunday

                          выделена дата окнчания действия часового пояса

                          проверялось на нескольких машинах

                          или я чегото не понимаю или одно из двух…

                          зы тестовая прога есть по ссылке выше. выполнить до и после установки патча
                            0
                            Простой вопрос:
                            Какие обновления нужно установить на почтовый сервер (Win2k3, Exchange 2003), чтобы клиенты, подключающиеся к почте по OWA в интерфейсе в настройках часовых поясов видели уже обновлённые часовые пояса. Т.е. "(UTC+04:00) Москва, С.-Петербург, Волгоград" вместо старых "(GMT+3) Москва, С.-Петербург, Волгоград".

                            Only users with full accounts can post comments. Log in, please.