Как известно, с принятием Федерального закона Российской Федерации от 03.06.2011г. № 107-ФЗ «Об исчислении времени» и Постановления Правительства Российской Федерации от 31.08.2011г. № 725 на территории Российской Федерации отменяется сезонный перевод часов и устанавливаются соответствующие часовые зоны и значения времени.
В связи с этим возникает ряд проблем с отключением пресловутого перехода на зимнее время в ОС выполняющих его автоматически, в том числе и в ОС Solaris.
Существует несколько вариантов решения проблемы :
Установка специальных патчей от производителя Oracle.
Для платформы Sparc :
Solaris 10 : 146470-04
Solaris 9 : 113225-29
Solaris 8 : 109809-17
Для платформы x86:
Solaris 10 : 146471-04
Solaris 9 : 116545-27
Solaris 8 : 109810-17
Данные патчи можно загрузить с сайта MOS (My Oracle Support). Доступ к патчам предоставляется при наличии поддержки на ОС. Следует учесть, что Solaris 8 уже давно отправлен в EOSL, и получить доступ к соответствующим патчам есть возможность только при наличии специальной программы поддержки Vintage Support.
Стоит обратить внимание, что патчи указанных ревизий (значений после "-" ) для Solaris 9 и 10 "работоспособны" с точки зрения решения проблемы с отменой перехода, чего не скажешь про их предыдущие версии.
Патчи для Solaris 8 (sparc и x86) решают проблему только "частично" - дело в том,
что разработчики патчей почему-то забыли положить в них бинарные файлы для зоны Europe, положив только исходники этой зоны. Соответственно, необходима "ручная" компиляция зоны после установки патча при помощи zic:
#zic /usr/share/lib/zoneinfo/src/europe
и проверить, что зона актуальна при помощи zdump, вывод должен быть таким :
#zdump -v Europe/Moscow|grep 2011
Europe/Moscow Thu Oct 13 13:33:31 2011 UTC = Thu Oct 13 17:33:31 2011 MSK isdst=0
Europe/Moscow Sat Mar 26 22:59:59 2011 UTC = Sun Mar 27 01:59:59 2011 MSK isdst=0
Europe/Moscow Sat Mar 26 23:00:00 2011 UTC = Sun Mar 27 03:00:00 2011 MSK isdst=0
(Значение isdst должно быть равным 0)
Кроме того, можно проверить что файл зоны имеет дату, когда была проведена компиляция зоны -
к примеру :
#ls -l /usr/share/lib/zoneinfo/Europe/Moscow
-rw-r--r-- 1 root other 558 Oct 13 17:31 /usr/share/lib/zoneinfo/Europe/Moscow
Изменение правил или зон с последующей их компиляцией.
Доступ к патчам есть далеко не у всех в виду отсутствия контрактов на поддержку ОС, не говоря уж про специальную программу Vintage Support для Solaris 8. Однако решить проблему нужно всем. В данном случае можно исправить вручную исходные файлы зон и скомпилировать их.
Возможны два подхода :
1) Изменение правила (rule) для Russia
2) Изменение конкретной зоны (zone)
Рассмотрим первый подход :
Изначально последние четыре строки для правила Russia в файле /usr/share/lib/zoneinfo/src/europe выглядят следующим образом :
Rule Russia 1992 only - Sep lastSat 23:00 0 -
Rule Russia 1993 max - Mar lastSun 2:00s 1:00 S
Rule Russia 1993 1995 - Sep lastSun 2:00s 0 -
Rule Russia 1996 max - Oct lastSun 2:00s 0 -
Для того, что запретить переход на зимнее время необходимо разрешить системе перейти на летнее время последний раз в 2011 году и разрешить обратную коррекцию ограничиваясь только 2010 годом, т. е.
Rule Russia 1992 only - Sep lastSat 23:00 0 -
Rule Russia 1993 2011 - Mar lastSun 2:00s 1:00 S
Rule Russia 1993 1995 - Sep lastSun 2:00s 0 -
Rule Russia 1996 2010 - Oct lastSun 2:00s 0 -
(подробное описание всех полей можно найти в #man zic)
После внесения изменений необходимо провести компиляцию при помощи zic
( zic /usr/share/lib/zoneinfo/src/europe) и проверить, что переход не планируется при помощи zdump (см. выше).
Данный подход является "глобальным" - настройки для всех зон, которые используют правило Russia будут формироваться в соответствии с этим общим правилом.
Соответственно, такой подход наиболее простой - не нужно изменять настройки конкретных и или всех зон России. Однако некоторые зоны уже не относящиеся к России также соотносятся с правилом Russia, например Europe/Minsk :
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Europe/Minsk 1:50:16 - LMT 1880
1:50 - MMT 1924 May 2 # Minsk Mean Time
2:00 - EET 1930 Jun 21
3:00 - MSK 1941 Jun 28
1:00 C-Eur CE%sT 1944 Jul 3
3:00 Russia MSK/MSD 1990
3:00 - MSK 1991 Mar 31 2:00s
2:00 1:00 EEST 1991 Sep 29 2:00s
2:00 - EET 1992 Mar 29 0:00s
2:00 1:00 EEST 1992 Sep 27 0:00s
2:00 Russia EE%sT
(подробное описание всех полей можно найти в #man zic)
Таким образом, наиболее правильным решением оказывается изменение настроек для конкретной или всех зон относящихся только к России.
Это и есть второй подход, который хотелось бы рассмотреть на примере зоны Europe/Moscow :
Оригинальная конфигурация зоны выглядит следующим образом :
Zone Europe/Moscow 2:30:20 - LMT 1880
2:30 - MMT 1916 Jul 3 # Moscow Mean Time
2:30:48 Russia %s 1919 Jul 1 2:00
3:00 Russia MSK/MSD 1922 Oct
2:00 - EET 1930 Jun 21
3:00 Russia MSK/MSD 1991 Mar 31 2:00s
2:00 Russia EE%sT 1992 Jan 19 2:00s
3:00 Russia MSK/MSD
Для того, чтобы запретить переход на зимнее время, в данном случае необходимо разрешить смещение на +3 часа относительно UTC только до 27 марта 2011 года и выставить постоянное смещение относительно UTC +4 и отключить правило Russia для этой зоны, так как правило Russia учитывает переход на зимнее время. Дополнительно убирается и определение аббревиатуры временной зоны MSD :
Zone Europe/Moscow 2:30:20 - LMT 1880
2:30 - MMT 1916 Jul 3 # Moscow Mean Time
2:30:48 Russia %s 1919 Jul 1 2:00
3:00 Russia MSK/MSD 1922 Oct
2:00 - EET 1930 Jun 21
3:00 Russia MSK/MSD 1991 Mar 31 2:00s
2:00 Russia EE%sT 1992 Jan 19 2:00s
3:00 Russia MSK/MSD 2011 Mar 27 2:00s
4:00 - MSK
Аналогичные изменения делаются и для любой другой зоны. Единственное отличие от Europe/Moscow зоны (где standard и daylight - аббревиатура перечислены через "/" ) для всех других зон необходимо описывать "стандартную" аббревиатуру вместо "составной" вида XXX%sT, например :
Конфигурация зоны Europe/Volgograd ДО внесения изменений :
Zone Europe/Volgograd 2:57:40 - LMT 1920 Jan 3
3:00 - TSAT 1925 Apr 6 # Tsaritsyn Time
3:00 - STAT 1930 Jun 21 # Stalingrad Time
4:00 - STAT 1961 Nov 11
4:00 Russia VOL%sT 1989 Mar 26 2:00s # Volgograd T
3:00 Russia VOL%sT 1991 Mar 31 2:00s
4:00 - VOLT 1992 Mar 29 2:00s
3:00 Russia VOL%sT
Конфигурация зоны Europe/Volgograd ПОСЛЕ внесения изменений :
Zone Europe/Volgograd 2:57:40 - LMT 1920 Jan 3
3:00 - TSAT 1925 Apr 6 # Tsaritsyn Time
3:00 - STAT 1930 Jun 21 # Stalingrad Time
4:00 - STAT 1961 Nov 11
4:00 Russia VOL%sT 1989 Mar 26 2:00s # Volgograd T
3:00 Russia VOL%sT 1991 Mar 31 2:00s
4:00 - VOLT 1992 Mar 29 2:00s
3:00 Russia VOL%sT 2011 Mar 27 2:00s
4:00 - VOLT
После внесения изменений, так же как и в случае с "глобальным" изменением правила, необходимо провести компиляцию при помощи zic
( zic /usr/share/lib/zoneinfo/src/europe) и проверить, что переход не планируется при помощи zdump (см. выше).
Установка зоны GMT+/-X.
Ну и наконец самым простым способом решить проблему отмены перехода на зимнее время - это "включить" принудительное смещение по GMT, например GMT+4,для тех кто живет по московскому времени. (Подробнее : #man TIMEZONE)
Однако, возникают вопросы с правильным отображением времен ранее созданных файлов со всеми отсюда вытекающими проблемами.
Стоит обратить внимание, что после выполнения любых вышеописанных изменений - будь то установка патча, перекомпиляция файла зоны или смена текущей зоны необходима перезагрузка системы для корректной работы уже запущенных приложений.