Перевод часов на зимнее время в FreeBSD

Проверяем текущий часовой пояс:
date ‘+%x %X %z %Z’
Получаем расписание перевода часов на 2014 год:
zdump -v /etc/localtime | grep 2014
Если видим две строки с корректировкой часового пояса 26 октября, значит, обновление не требуется.
/etc/localtime Sat Oct 25 19:59:59 2014 UTC = Sun Oct 26 01:59:59 2014 YEKT isdst=0 gmtoff=21600
/etc/localtime Sat Oct 25 20:00:00 2014 UTC = Sun Oct 26 01:00:00 2014 YEKT isdst=0 gmtoff=18000
Если вывод пуст, или отображается более двух строк, значит необходимо обновить базу часовых поясов.


Для FreeBSD 8.4, 9.1, 9.2, 9.3 и 10.0 с ядром GENERIC используем FreeBSD Update.
Системы с модифицированным ядром обновляем из исходников или из коллекции портов.
Для устаревших систем обновляем базу часовых поясов вручную.
Обновление системы с использованием FreeBSD Update

Проверяем идентификатор ядра:
uname -i
Если видим значение отличное от GENERIC, выполняем установку из исходников или из коллекции портов. В случае бинарного обновления, модифицированное ядро будет заменено стандартным.
Загружаем обновления:
freebsd-update fetch
Устанавливаем обновления:
freebsd-update install
Обновляем текущий часовой пояс:
tzsetup -r
Переходим к верификации.

Обновление из исходников с пересборкой мира

Способ оптимален для тех, кто обновляет систему из исходников.
Устанавливаем патч FreeBSD-EN-14:10.tzdata.
Пересобираем мир.
Обновляем текущий часовой пояс:
tzsetup -r
Переходим к верификации.
Установка из коллекции портов

Внимание! Порт устанавливается в /usr/share/zoneinfo с заменой системных файлов. При удалении пакета zoneinfo удаляется системная база часовых поясов. Удаление пакета необходимо выполнить непосредственно перед установкой новой версии системы.
Обновляем коллекцию портов:
portsnap fetch && portsnap update || portsnap extract
Устанавливаем порт zoneinfo:
cd /usr/ports/misc/zoneinfo && make install clean
Обновляем текущий часовой пояс:
tzsetup -r
Переходим к верификации.

Установка базы часовых поясов вручную

Загружаем актуальную версию базы часовых поясов:
fetch ftp://ftp.iana.org/tz/tzdata-latest.tar.gz
Распаковываем архив:
mkdir tzdata
cd tzdata
tar xzf ../tzdata-latest.tar.gz
Компилируем данные для Европы, там же находится и азиатская часть России:
zic europe
Результат компиляции записывается непосредственно в папку назначения: /usr/share/zoneinfo. Проверяем, что файлы имеют текущую дату:
ls -l /usr/share/zoneinfo/Europe
ls -lt /usr/share/zoneinfo/Asia | head
Обновляем текущий часовой пояс:
tzsetup -r
Переходим к верификации.
Замена часового пояса на GMT-x

В особо запущенных случаях, если не работает ни один вышеописанный способ.
Задаем временную зону GMT-x:
cp /usr/share/zoneinfo/Etc/GMT-5 /etc/localtime
Использовать команду zdump для верификации в этом случае бессмысленно, поскольку автоматического перевода часов в этих временных зонах не предусмотрено.
Верификация

Проверяем текущий часовой пояс:
date ‘+%x %X %z %Z’
Получаем расписание перевода часов на 2014 год:
zdump -v /etc/localtime | grep 2014
Если видим две строки с корректировкой часового пояса 26 октября, значит, база обновлена успешно.
/etc/localtime Sat Oct 25 19:59:59 2014 UTC = Sun Oct 26 01:59:59 2014 YEKT isdst=0 gmtoff=21600
/etc/localtime Sat Oct 25 20:00:00 2014 UTC = Sun Oct 26 01:00:00 2014 YEKT isdst=0 gmtoff=18000
Изменения вступают в силу для вновь запускаемых программ, чтобы применить изменения для служб, необходимо перезагрузить систему.
Обновление часовых поясов в PHP

PHP использует собственную базу часовых поясов, ее необходимо обновить отдельно.
Проверяем необходимость обновления базы, получаем часовой пояс на 1 ноября 2014 года, регион необходимо указать свой:
php -r ‘date_default_timezone_set(«Asia/Yekaterinburg»); echo «\n».date («P»,1414789200).»\n\n»;’
Если имеем некорректный часовой пояс, приступаем к обновлению.
При установке PHP из пакета:
pkg install pecl-timezonedb
При установке PHP из портов:
cd /usr/ports/misc/pecl-timezonedb/
make install clean
Проверяем часовой пояс.
Если PHP работает в качестве модуля Apache, перезагружаем веб-сервер чтобы применить изменения:
service apache24 restart
Сборка pecl-timezonedb вручную для устаревших систем

Метод проверен на FreeBSD 7.4.
Требуется наличие autoconf, иначе phpize завершится с ошибкой, и скрипт configure не будет создан.
Загружаем расширение:
fetch -o timezonedb.tgz http://pecl.php.net/get/timezonedb
Распаковываем:
tar -xvf timezonedb.tgz
Переходим в папку с исходниками:
cd timezonedb-2014.8
Собираем и устанавливаем:
phpize
./configure
make install
Добавляем строку extension=timezonedb.so в extensions.ini:
mkdir /usr/local/etc/php
printf «\nextension=timezonedb.so\n» >>/usr/local/etc/php/extensions.ini
cat /usr/local/etc/php/extensions.ini
Проверяем часовой пояс.