Перевод часов на зимнее время в 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 не приходилось, то следует выбрать подходящий вам метод в виртуальной машине.

Для 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 использует собственную базу часовых поясов, ее необходимо обновить отдельно.

Получаем текущее время и часовой пояс, регион необходимо указать свой:

php -r 'date_default_timezone_set("Asia/Yekaterinburg"); echo "\n".date ("d.m.Y H:i P")."\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

Проверяем часовой пояс.

Ссылки

Википедия: tz database.

Перевод времени 26 октября 2014 года или ударим трудом по разгильдяйству: информация об изменении часовых поясов; обновление Windows XP, Windows 2003 Server, Outlook 2000-2007.

Комментарии:

RSS
  • Вячеслав
    15.04.2021 17:53
    Автору - респект!
    • IT Adept
      15.04.2021 21:30
      Статья давным-давно не актуальна.
      Если у вас остались системы со старыми часовыми поясами, вам следует выполнить апгрейд системы до актуальной версии.
  • Олег
    22.12.2014 22:08
    Спасибо, вручную сделал по инструкции выше
  • HM
    20.11.2014 13:25
    Больше человеческое спасибо.
    Собрал и установил pear пакет для php
  • olegeech
    31.10.2014 15:27
    Спасибо. Правда в roundcube до сих показывает по старому времени, не могу понять, что еще на это влияет.
  • Alexey
    29.10.2014 14:26
    С PHP не помогло, что посоветуете?
    • IT Adept
      29.10.2014 14:51
      Версия FreeBSD? Версия PHP? Способ установки базы часовых поясов?

      Вывод команды: php -i | grep "Timezone Database"

      Должен быть следующим:

      Timezone Database => external
      Alternative Timezone Database => enabled
      Timezone Database Version => 2014.7

      Проверяем extensions.ini: cat /usr/local/etc/php/extensions.ini
      Файл должен содержать строку: extension=timezonedb.so

      Получаем путь к папке с расширениями: php -i | grep extension_dir
      Проверяем содержимое папки с расширениями ls -l папка
      В папке должен находиться файл timezonedb.so и иметь актуальную дату.
  • Alexey
    29.10.2014 14:25
    C PHP не помогло. Пока поставил Europe\Minsk, но как то не красиво.
  • GV
    27.10.2014 11:08
    Большое спасибо, всё получилось и на 7.3 и на 9.2!
  • Macmep
    26.10.2014 16:10
    Очень своевременный материал, спасибо! =) Ибо хорошо яичко ко Христову Дню. На 7.4 после компиляции zic europe файлы обновляются по указанному пути, затем sysinstall и выбор TimeZone через него, далее, для прядка, ntpdate pool.ntp.org. Все. Нирвана... =)))
  • Sandro
    23.10.2014 20:53
    Добрый день.
    У нас все очень хреново.
    Есть куча старых FreeBSD, 7.х и ранее, естественно, ничего не собирается.
    Есть какие-нибудь дельные советы, кроме как посыпать пеплом голову, накрыться простыней и ползти в сторону кладбища?
    Можно ли скопировать сами файлы зон с более современных версий (у нас и они есть)?
    • IT Adept
      23.10.2014 21:08
      Системная база часовых поясов обновляется вручную без проблем.

      С PHP и прочим ПО будут проблемы. Здесь надо смотреть требуется ли работа с различными часовыми поясами, если часовой пояс один, забиваем в конфиг Etc/GMT-x и готово.
      • Sandro
        24.10.2014 09:43
        Большое спасибо за оперативность.
        С утра начали работу по вашим рекомендациям, пока все ок.
    • Serge3leo
      24.10.2014 05:50
      "FreeBSD, 7.х и ранее", слово "ранее" - "бодрит", поэтому я бы рекомендовал бы:
      - сохранить /etc/localtime и /usr/share/zoneinfo;
      - скопировать обновлённый /etc/localtime из более современной версии;
      - проверить работоспособность `date' и `zdump -v /etc/localtime';
      - если всё хорошо, а в системе используется не только текущая часовая зона, то можно копировать файлы usr/share/zoneinfo
    • Serge3leo
      23.10.2014 13:22
      P.S.
      Кроме того, не забыть обновить PHP, ruby, java, perl (как минимум, пакет p5-DateTime-TimeZone), если они присутствуют в системе.
    • IT Adept
      23.10.2014 15:22
      Материал обновил. Спасибо.
      • Serge3leo
        24.10.2014 05:36
        misc/zoneinfo - это "опасный" пакет (port), т.к. в его plist входят файлы /usr/share/zoneinfo. Соответственно, если когда-нибудь FreeBSD будет обновляться, то нужно не забыть его удалить непосредствеено перед обновлением.

        Смотри так же:
        http://fido7.ru.unix.bsd.narkive.com/i6T4t2Ed/zoneinfo-26.4
        • IT Adept
          24.10.2014 12:43
          Хорошая западла. При удалении пакета сносится системная база часовых поясов. И отменить регистрацию пакета штатными средствами pkg, без прямого ковыряния БД, невозможно.

          В таком случае проще вручную часовые зоны скомпилировать.
          • Serge3leo
            24.10.2014 13:57
            А зачем его удалять? :) До обновления ОС он необходим, а после обновления у него просто контрольные суммы не сходятся, а так же не мешает же. Хотя, конечно, надо бы его исправить.
            • IT Adept
              25.10.2014 00:23
              Пакет удалять не нужно, достаточно отменить его регистрацию. Раньше подобный финт можно было провернуть удалением пакета из /var/db/pkg, теперь процедура усложнилась.

              Часть контрольных сумм может и сойтись. А при условии, что пакеты я обычно чищу после апгрейда базовой системы, есть риск ее слегка покоцать.

              Лучше сразу подобрать разложенные грабли, пока про них не забыл :)
  • AlAnKu
    07.10.2014 13:06
    Реально кто-то тестировал? У меня не прокатило на тестовом сервере, время не перевелось....
    • IT Adept
      07.10.2014 13:29
      Обновил на своих серверах, этот же метод использовал в 2011 году.

      Устанавливали из портов или вручную? Какая версия системы?

      Выложите вывод команд:

      ls -l /etc/localtime
      ls -l /usr/share/zoneinfo/Europe/Moscow
      • AlAnKu
        07.10.2014 13:43
        Из портов и ручками ставил.
        $ ls -l /etc/localtime
        -r--r--r-- 1 root wheel 1282 Oct 7 12:41 /etc/localtime
        $ ls -la /usr/share/zoneinfo/Asia/Yekaterinburg
        -rw-r--r-- 1 alex alex 1282 Oct 7 12:40 /usr/share/zoneinfo/Asia/Yekaterinburg

        А вот это, когда отправил виртуалку в перезагрузку:
        Oct 26 01:59:50 web-dmz date: date set by root
        Oct 26 02:00:12 web-dmz reboot: rebooted by root
        Oct 26 03:00:12 web-dmz syslogd: exiting on signal 15

        Локальное время перевелось нас час вперед...
      • Serega
        07.10.2014 16:14
        Не подскажете в чем проблема?
        9.2-RELEASE FreeBSD
        обновил timezone из портов

        zdump -v /etc/localtime | grep 2014
        /etc/localtime Sat Oct 25 21:59:59 2014 UTC = Sun Oct 26 01:59:59 2014 MSK isdst=0 gmtoff=14400
        /etc/localtime Sat Oct 25 22:00:00 2014 UTC = Sun Oct 26 01:00:00 2014 MSK isdst=0 gmtoff=10800

        date -j 201410010000 '+%z %Z' && date -j 201411010000 '+%z %Z'
        +0400 MSK
        +0300 MSK

        вроде все ок, провожу эксперимент
        date 1410260159
        date
        Sun Oct 26 01:59:00 MSK 2014
        Наступает 02:00:00 часы продолжают тикать, время не переводится :(
        Перезагружал, время не перевелось.
        На OpenSuse то же самое.
          • IT Adept
            07.10.2014 16:57
            Проверил на виртуалке.

            Время переводится в 02:00 на час назад.

            Команда date 1410260159 устанавливает время в новой часовой зоне: +0300 MSK.

            Попробуйте:

            date 1410260154
            date '+%x %X %z %Z'
            • AlAnKu
              08.10.2014 08:22
              Спасибо! Сейчас попробовал так Вы написали: "date 1410260154", время перевелось! Ставил до этого "date 1410260159.50"...
            • Serega
              09.10.2014 14:54
              Спасибо!
              Пробовал date 1410260154, однако время в 02:00 не перевелось :(
              Установил date 1410260100 - спустя 50 мин время перевелось!
              Опытным путем и с вашей помощью, выяснилось что нужно выставлять время, которое сервер считает зоной +04, тогда в 02:00 осуществляется перевод.
              Для меня это оказалось 1410260110, 1410260111 - уже +03 :) Почему - до сих пор не ясно :)
              Резюме: после установки времени смотрим на пояс date '+%x %X %z %Z' , убеждаемся что у нас еще +04, ждем 02:00 - переводится.
              • Serega
                09.10.2014 14:54
                *Установил date 1410260100 - спустя 60 мин время перевелось!
  • Serge3leo
    07.10.2014 11:16
    "zic asia" необязательно, т.к. вся Россия находится в europe. Да и использовать в дальнейшем лучше актуальную версию: ftp://ftp.iana.org/tz/tzdata-latest.tar.gz
    • IT Adept
      07.10.2014 13:31

      Ссылку обновил, спасибо.

Ваш комментарий:


Вы не бот: