В Украине отменен переход на зимнее время. Верховная Рада поддержала законопроект №8330 «Об изменении порядка исчисления времени на территории Украины». В связи с этими законодательными инновациями, на плечи украинских IT-шников легла производственная задача – 30 октября 2011 навсегда остаться в киевском летнем времени. Теперь этот часовой пояс в unix называется FET – Further-eastern European Time или дальневосточно-европейское время.

Время в Linux. Теория

Текущий часовой пояс в ОС Linux устанавливается файлом /etc/localtime. Этот файл представляет собой ссылку на информационный файл зоны или его копию, в большинстве дистрибутивов расположенный в каталоге /usr/share/zoneinfo. В данном каталоге размещена zoneinfo database база данных информации о зонах, или другими словами, tz database (timezone database — база данных часовых поясов) — совместно собираемая информация о мировых временных зонах. Иногда она упоминается как «база данных Олсона» (Olson database), так как была основана Артуром Дэвидом Олсоном (Arthur David Olson). Редактором и хранителем базы является Пол Эггерт (Paul Eggert). Обновления кода базы данных часовых поясов можно получить непосредственно из источника на ftp://elsie.nci.nih.gov/pub/

Как не перейти на зимнее время. Решение

  • Качаем обновление tzdata2011k.tar.gz от 26 сентября 2011 года, в котором присутствует информация по новым часовым поясам для Украины, в которое вошли зоны Europe/Kiev, Europe/Uzhgorod, Europe/Zaporozhye, Europe/Simferopol.
  • Распаковываем
    mkdir tz
    mv tzdata2011k.tar.gz ./tz
    cd tz/
    tar xzf tzdata2011k.tar.gz
    
  • Перед внесением изменений проверим переходы времени для нашей текущей зоны. Видим ежегодное расписание переходов времени зимнее/летнее вплоть до 2038 года.
    zdump -v Europe/Kiev
    ...
    Europe/Kiev  Sun Mar 27 00:59:59 2011 UTC = Sun Mar 27 02:59:59 2011 EET isdst=0 gmtoff=7200
    Europe/Kiev  Sun Mar 27 01:00:00 2011 UTC = Sun Mar 27 04:00:00 2011 EEST isdst=1 gmtoff=10800
    Europe/Kiev  Sun Oct 30 00:59:59 2011 UTC = Sun Oct 30 03:59:59 2011 EEST isdst=1 gmtoff=10800
    Europe/Kiev  Sun Oct 30 01:00:00 2011 UTC = Sun Oct 30 03:00:00 2011 EET isdst=0 gmtoff=7200
    ...
    Europe/Kiev  Sun Oct 25 00:59:59 2015 UTC = Sun Oct 25 03:59:59 2015 EEST isdst=1 gmtoff=10800
    Europe/Kiev  Sun Oct 25 01:00:00 2015 UTC = Sun Oct 25 03:00:00 2015 EET isdst=0 gmtoff=7200
    ...
    
  • Убедимся в наличии необходимого обновления
    vi europe
    ...
    Zone Europe/Kiev        2:02:04 -       LMT     1880
                            2:02:04 -       KMT     1924 May  2 # Kiev Mean Time
                            2:00    -       EET     1930 Jun 21
                            3:00    -       MSK     1941 Sep 20
                            1:00    C-Eur   CE%sT   1943 Nov  6
                            3:00    Russia  MSK/MSD 1990
                            3:00    -       MSK     1990 Jul  1 2:00
                            2:00    -       EET     1992
                            2:00    E-Eur   EE%sT   1995
                            2:00    EU      EE%sT   2011 Mar lastSun 1:00u
                            3:00    -       FET # Further-eastern European Time
    
    ...
    
  • На всякий случай делаем резервную копию файла с текущими настройками:
    mv /etc/localtime  /etc/localtime-old
    
  • Компилируем временные зоны для Европы. zic читает текстовый файл с описаниями зон и на выходе формирует файлы специфического формата. Стоит обратить внимание что без ключа -d пишет файлы временных зон сразу в /usr/share/zoneinfo, что нам и необходимо.
    zic europe
    
  • Создаем ссылку на обновленную временную зону
    ln -sf /usr/share/zoneinfo/Europe/Kiev /etc/localtime
    
  • Проверяем установленную зону в файле
    cat /etc/sysconfig/clock | grep ZONE
    ZONE="Europe/Kiev"
    
  • После обновления проверим переходы времени для нашей текущей зоны. В последний раз переход произошел Mar 27 04:00:00 2011
    zdump -v Europe/Kiev
    ...
    Europe/Kiev  Sun Mar 27 00:59:59 2011 UTC = Sun Mar 27 02:59:59 2011 FET isdst=0 gmtoff=7200
    Europe/Kiev  Sun Mar 27 01:00:00 2011 UTC = Sun Mar 27 04:00:00 2011 FET isdst=0 gmtoff=10800
    Europe/Kiev  Mon Jan 18 03:14:07 2038 UTC = Mon Jan 18 06:14:07 2038 FET isdst=0 gmtoff=10800
    Europe/Kiev  Tue Jan 19 03:14:07 2038 UTC = Tue Jan 19 06:14:07 2038 FET isdst=0 gmtoff=10800
    
  • Убедимся, что 30 октября 2011 года время будет «непереход» на зимнее время.
    # date
    Wed Sep 28 15:48:51 FET 2011
    # date --date='768hours'
    Sun Oct 30 15:48:58 FET 2011
    

PS: Всвязи с судебными процедурами, и временной недоступностью первоисточника размещаю копию tzdata2011k.tar.gz.

PS: Для тех кто уже перевел, выкладываю предыдущую версию TZ данных без изменений по Украине от 20 сентября, отмененных 18 октября 2011tzdata2011j.tar.gz