Pull to refresh

Переезд временной зоны MSD в MSK — новый Y2K локального масштаба

Reading time8 min
Views25K
Все, наверное, хоть раз слышали, что в России с 2011 года отменен переход с летнего время на зимнее. Чем же это грозит каждому из нас — и администраторам большого количества серверов в сложных системах, и обычным пользователям, имеющим один компьютер и мобильный телефон? Что случится в ночь с 29 на 30 октября 2011 — до которой осталось, кстати, всего 2 недели?

Новый Федеральный закон Российской Федерации от 3 июня 2011 г. N 107-ФЗ «Об исчислении времени»:
  • принят Государственной Думой 2011-05-20
  • одобрен Советом Федерации 2011-05-25
  • опубликован 2011-06-06
  • подписан президентом 2011-06-09
  • вступил в силу с 2011-08-07
Чем же грозят нам эти изменения и что от этого может сломаться?

Что именно и когда изменяется?


У Europe/Moscow было два разных часовых пояса: летнее декретное время MSD = UTC+4 и зимнее время MSK = UTC+3. Теперь у этой timezone станет всего один общий часовой пояс, именующийся MSK и равный UTC+4. Другие временные зоны, использующиеся на территории РФ, меняются аналогичным образом, но проводить эксперименты всегда проще всего на наиболее «официальной» — т.е. именно Europe/Moscow.

Иллюстрировать изменения лучше всего на UNIX timestamp — это количество секунд, прошедших с начала Эпохи, 1970-01-01 00:00:00 UTC. Это простое целое число и оно абсолютно никак не зависит ни от каких часовых поясов и изменяющихся местных законов.

Что именно Timestamp Было Стало
Начало Эпохи 0 Jan  1 03:00:00 MSK 1970 Jan  1 03:00:00 MSK 1970
Зима начала 2011 года 1296000000 Jan 26 03:00:00 MSK 2011 Jan 26 03:00:00 MSK 2011
Лето 2011 1310000000 Jul  7 04:53:20 MSD 2011 Jul  7 04:53:20 MSK 2011
Зима конца 2011 года 1325000000 Dec 27 18:33:20 MSK 2011 Dec 27 19:33:20 MSK 2011
За секунду до возможного переключения 1319929199 Oct 30 02:59:59 MSD 2011 Oct 30 02:59:59 MSK 2011
Сразу после переключения 1319929200 Oct 30 02:00:00 MSK 2011 Oct 30 03:00:00 MSK 2011

Итого, как мы видим, момент истины или такой новый маленький локальный Y2k наступает с 1319929199 секунды на 1319929200-ую — либо все ломается, либо нет.

Апстрим


Для подавляющего большинства операционных систем апстримом (т.е. общим сайтом, который первоначально собирает всю эту информацию) являлся испытывающий сейчас определенный копирайтные сложности проект TZ database, располагавшийся по адресу elsie.nci.nih.gov/pub

Новые версии этой БД выходили регулярно и имели четкую систему нумерации: первые 4 цифры — номер года, затем одна буква — номер версии внутри года.

В TZ database соответствующие изменения были внесены весьма оперативно: закон РФ опубликован 2011-06-06, а изменения были опубликованы в версии 2011h от 2011-06-15.

Таким образом, если коротко: если в вашей ОС используется пакет типа tzdata с любой версией, равной или старше 2011h (т.е. 2011i, 2011j и т.д.) — то все в порядке.

Чем грозит неправильная информация о timezone?


Сильно зависит от того, что за система работает со временем и насколько эта работа критична.

Например, если у вас нет систем, которые работают с timezone Europe/Moscow — например, у вас все-все-все работает по UTC — то остаток статьи можно с чистой совестью не читать.

В зоне риска находятся в первую очередь:
  • Логи — если они ведутся не по UTC
  • Базы данных, учетные системы, органайзеры
  • Биллинг, бухгалтерские системы
  • Любые системы, работающие в потоковом режиме 24x7: мониторинг, видеонаблюдения и т.д.
  • Системы, которые выполняют функцию часов и будильников — т.е. мобильные телефоны, десктопы, отображающие время и т.д.

Я получаю время с ntp-сервера, о чем мне беспокоиться — там ведь время наверняка переведут, как надо?


Нет, не переведут: с ntp-сервера приходит именно UNIX timestamp, который описан выше, а все операции с временными зонами производит операционная система, уже зная локальную настройку. До тех пор, пока локальная настройка — неверная, получение времени с ntp-сервера будет, наоборот, создавать проблему, которую даже вручную толком не решить: придется либо отказываться от использовании ntp, либо попытке «подвести на час» через некоторое время ntp все «исправит» обратно. «Чинить» нужно именно timezone.

Почему вы все время говорите о каком-то UTC, ведь весь мир ориентируется на время по Гринвичу — GMT?


В общем, нет: именно UTC (Universal Time, Coordinated) используется как основной стандарт по всему миру со времен изобретения атомных часов (~начало 1960-х) — в технике, в авиации, в астрономии и во всех остальных местах, где нужно точное время.

Если совсем коротко — то GMT и UTC принципиально различаются по механизму учета времени — в GMT он куда более «неудобный» для техники. В разные моменты времени GMT и UTC могут отставать друг от друга до ~0.9 секунды. Несмотря на то, что прошло уже порядка 50 лет, люди все равно по инерции часто произносят «по Гринвичу» и даже умудряются действительно регулярно писать аббревиатуру GMT.

Как проверить, сломается ли что-то на моей системе?


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

Универсальный способ проверки


Универсальный, но весьма длинный способ проверки — годится, в частности, для любых мобильных телефонов и прочих подобных устройств: выставить часы принудительно на 2011-10-30 01:59 и подождать 1 час и 1 минуту. Если устройство/ОС переставит после этого часы на 02:00 — то, значит, все плохо, timezone не обновлены. Если часы останутся на 03:00 — все в порядке, изменения применены.

Linux


Традиционно в Linux есть системный timezones, располагающиеся в /usr/share/zoneinfo. На данный момент ситуация с популярными дистрибутивами такая — хорошо видно, кстати, какие дистрибутивы как быстро обновляются:
Дистрибутив Пакет Исправление с версии Дата
ALT Linux Platform 6 tzdata 2011h 2011-07-01
Arch Linux tzdata 2011h-1 <2011-07-08
CentOS/RHEL 4 tzdata 2011h-2.el4 2011-08-29
CentOS/RHEL 5 tzdata 2011h-1.el5 2011-06-28
Debian stable (squeeze) tzdata 2011h-0squeeze1 2011-08-13
openSUSE 11.4 timezone 2011i-2.2.1 2011-09-04
Ubuntu hardy tzdata 2011j~repack-0ubuntu0.8.04 2011-09-16
Ubuntu lucid tzdata 2011j-0ubuntu0.10.04 2011-09-16
Ubuntu natty tzdata 2011j-0ubuntu0.11.04 2011-09-15

Как проверять: запустить вот такой скрипт:
#!/bin/sh -ef
S1=$(LC_ALL=C TZ=Europe/Moscow date -d @1314567890)
[ "$S1" = 'Mon Aug 29 01:44:50 MSK 2011' ] || (echo FAIL1; exit 1)
S2=$(LC_ALL=C TZ=Europe/Moscow date -d @1324567890)
[ "$S2" = 'Thu Dec 22 19:31:30 MSK 2011' ] || (echo FAIL2; exit 2)
echo OK

Если он выдает что-то, отличное от OK и нулевого exit status — то проблема на тестируемой системе есть. Нужно попробовать обновить систему: если поможет, отписаться, что в таком-то дистрибутиве с такой-то версии такого-то пакета с timezones проблема исчезла; если не поможет — то отписаться, что в таком-то дистрибутиве проблема есть до сих пор.

FreeBSD


Исправления в head и в stable FreeBSD 8 были внесены 2011-06-28.

Как проверять: запустить чуть-чуть измененный вариант скрипта, приведенного выше:
#!/bin/sh -ef
S1=$(LC_ALL=C TZ=Europe/Moscow date -r 1314567890)
[ "$S1" = 'Mon Aug 29 01:44:50 MSK 2011' ] || (echo FAIL1; exit 1)
S2=$(LC_ALL=C TZ=Europe/Moscow date -r 1324567890)
[ "$S2" = 'Thu Dec 22 19:31:30 MSK 2011' ] || (echo FAIL2; exit 2)
echo OK

Скорее всего этот же скрипт подойдет и для Mac OS X. Буду признателен, если кто-то расскажет, как там обстоят дела.

Solaris


Timezone обновлены до 2011h в следующих патчах:
  • SPARC, Solaris 8: patch 109809-17
  • SPARC, Solaris 9: patch 113225-29
  • SPARC, Solaris 10: patch 146470-04
  • x86, Solaris 8 patch 109810-17
  • x86, Solaris 9 patch 116545-27
  • x86, Solaris 10 patch 146471-04
Установить можно, как обычно, через patchadd, после установки придется либо перезагрузиться, либо перезагрузить зону через tzreload.

Соответствующий баг заведен под номером 7055084.

Windows


Обновление приходит с накопительным пакетом обновлений часовых поясов для операционных систем Windows за август 2011 года — обновление 2570791 (спасибо pokryshkin). Установка самого патча перезагрузки не требует. Исправления доступны для операционных систем:
  • Windows 7
  • Windows Server 2008 R2
  • Windows Server 2008 SP2
  • Windows Vista
  • Windows Server 2003 SP2
  • Windows XP SP3
Более старые операционные системы останутся без обновлений.

Есть также ручное решение, описанное в 914387.
(подсказывает ComputerPers)

Гораздо более подробное описание решений для Windows-систем и подсистем на их базе можно прочитать в отдельной статье «Изменение часовых зон в России, Белоруссии, Украине и Армении» от roman_tik.

Java


Язык Java, как правило, носит свои timezones с собой где-то в районе $JAVA_HOME/lib/zi — но в некоторых случаях (при инсталляции пакетом из дистрибутива) эти файлы генерируются на основе общесистемных.

В «официальной» поставке Oracle Java SE изменения внесены на основе 2011h, номер версии 1.3.40, обновление от 2011-06-29.

Как проверять: создать файл TestMSD.java с таким содержимым:
import java.util.*;
import java.text.DateFormat;

public class TestMSD {
    public static void main(String[] args) {
        Calendar c = Calendar.getInstance(TimeZone.getTimeZone("Europe/Moscow"));
        DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, Locale.US);
        df.setCalendar(c);

        c.setTimeInMillis(1314567890L * 1000L);
        if (!df.format(c.getTime()).equals("Monday, August 29, 2011 1:44:50 AM MSK")) {
            System.out.println("FAIL1");
            System.exit(1);
        }

        c.setTimeInMillis(1324567890L * 1000L);
        if (!df.format(c.getTime()).equals("Thursday, December 22, 2011 7:31:30 PM MSK")) {
            System.out.println("FAIL2");
            System.exit(2);
        }

        System.out.println("OK");
        System.exit(0);
    }
}

Скомпилировать этот файл командой javac TestMSD.java, а затем запустить командой java TestMSD. Если всё хорошо — то запуск выведет OK на stdout и вернется с exit status = 0, иначе выведется сообщение об ошибке.

Android


Общая база данных для временных зон живет в Android-системе обычно в файле /etc/timezones.db, откуда ее использует java-машина и все приложения на java. Выделенной /usr/share/zoneinfo в системе по умолчанию нет.

Как правило, со всеми аппаратами, что силами хабрасообщества удалось проверить, ситуация грустная:
  • Asus TF101 — последняя штатная прошивка от ASUS, Android 3.2.1 — все плохо (проверил flashvoid)
  • Google Nexus One — последняя официальная прошивка (2.3.6) — все плохо (проверил binba)
  • Google Nexus One — c прошивкой CyanogenMod-7.1, build 220 от 2011-10-13 — все плохо (проверил Anjin)
  • Google Nexus S — последняя официальная прошивка (2.3.6) — все плохо (проверил 8bitjoey)
  • Google Nexus S — прошивка WhisperCore 0.5.5 — все плохо (проверял Darka)
  • HTC Desire — последняя официальная прошивка (2.29.405.5 CL293415, Android 2.2) — все плохо
  • HTC Desire — developer preview (2.3.3) — все плохо (проверил LanG)
  • HTC Desire Z — последнее обновление (2.42.205.2, Android 2.3.3) — все плохо (проверил AlexeyRU)
  • HTC Desire Z — с последней прошивкой MIUI (1.10.07) — все плохо (проверил NoOne)
  • HTC Desire HD — последняя официальная прошивка (2.50.405.2, Andriod 2.3.3) — все плохо (проверил dolgonosic)
  • HTC Legend — сборка 3.15.405.3 CL291292 (Android 2.2) — все плохо (проверил ihoru)
  • HTC Wildfire S — с прошивкой 1.33.401.2, Android 2.3.3 — все плохо (проверил Wildy)
  • LG Optimus One — с прошивкой LG-P500-v20C, Android 2.3.3 — все плохо (проверил ChemAli)
  • LG Optimus One — с прошивкой LG-P500-v20D, Android 2.3.3 — все плохо (проверил Nikolaich)
  • Motorola Milestone — последняя официальная прошивка (2.1-update1, Android 2.1) — все плохо
  • Samsung Galaxy S II — прошивка на Android 2.3.3, все плохо (проверил aim)
  • Samsung Galaxy Ace — последняя прошивка S5830XXKPO, Android 2.3.5 — все хорошо (проверил Bytamine)

Как проверить: можно просто установить любую дату из зимы 2011-2012 и увидеть, переключилась ли зона на «Moscow Standard Time» или нет; вот пример «плохого» поведения:


Maemo


Телефоны на базе Maemo обладают архитектурой, весьма близкой к стандартным GNU/Linux — т.е. имеют /usr/share/zoneinfo, аналогичный пакет с tzdata и т.д. Проверенные варианты (спасибо wholeman):
  • Maemo5 (AKA Fremantle), Nokia N900 — все плохо
  • Maemo6 (AKA MeeGo 1.2 Harmattan), Nokia N9/N950 — все в порядке
Как проверить: для устройств с busybox'ом можно воспользоваться командой date -d 12221931.30 +%s и сравнивать результат с 1324567890.

Symbian


Скорее всего, проблемными будут практически все аппараты, т.к. апдейтов прошивок из-за такой «мелочи» скорее всего не будет:
  • Symbian Anna, Nokia E7 — проблема есть (проверял wholeman)
Как проверить: аналогично Android, можно зайти в «Параметры → Телефон → Время и дата», переставить дату на что-нибудь из зимы 2011 и посмотреть, изменится ли часовой пояс на «GMT +3.00 Москва»:

Если изменится — то да, проблема есть.



Так как тема эта в целом весьма обширная, поэтому прошу помощи хабрасообщества в проверке всего, до чего можно дотянуться, чтобы создать своего рода справочник: что уже обновлено, что можно обновить (и в каких именно обновлениях этот патч накладывается), что ломается, а что нет — в частности, как с этим обстоят дела в тех системах и средах, где у меня не добрались руки проверить: различные версии Windows, Mac OS X / Classic, различные версии/прошивки Symbian, Android, iOS, MeeGo, Windows Mobile/Phone 7, Nabaztag, Playstation/XBox, Perl, PHP, Ruby, Python, SQL-базы и т.д.
Tags:
Hubs:
+141
Comments193

Articles