Столкнулся с проблемой, при выводе времени, yii\i18n\Formatter формирует для зоны ‘Europe/Moscow’ время, соответствующее GMT+4:
$timeZone = 'UTC' Yii::$app->formatter->timeZone = $timeZone; echo $timeZone . ': ' . Yii::$app->formatter->asTime(time()) . '<br>'; $timeZone = 'Europe/Moscow' Yii::$app->formatter->timeZone = $timeZone; echo $timeZone . ': ' . Yii::$app->formatter->asTime(time()) . '<br>';
выводил :
UTC: 6:54:39 Europe/Moscow: 10:54:39
В конфиге приложения временная зона указана явно: ‘timeZone’ => ‘Asia/Omsk’.
Выяснилось, что все дело в устаревшей, двухлетней давности библиотеке ICU версии 52.1. Версия PHP актуальная, на данный момент: 5.6.13.
Узнать установленные версии PHP и ICU можно при помощи простого скрипта:
<?php echo "PHP: " . PHP_VERSION . "<br>\n"; echo "ICU: " . INTL_ICU_VERSION . "<br>\n";
За отсутствием в репозиториях свежей версии ICU, знающей обо всех последних манипуляциях с часовыми поясами и летним/зимним временем, пришлось собрать из исходников ICU 55.1 и установить свежее pecl расширение intl.
Плацдарм: Fedora 21 x64 Server.
Подготовка
Первым делом удалим php-intl и установим нужные инструменты
yum remove -y php-intl yum install -y gcc gcc-c++.x86_64 php-devel php-pear
Скачиваем и распаковываем исходники ICU
wget http://download.icu-project.org/files/icu4c/55.1/icu4c-55_1-src.tgz tar zxvf icu4c-55_1-src.tgz
Сборка и установка
Собираем и устанавливаем ICU в указанный путь
cd icu/source ./configure --prefix=/opt/icu5c && make && make install
Устанавливаем расширение intl
pecl install intl
На запрос Specify where ICU libraries and headers can be found [DEFAULT] :, укажем путь к новому ICU: /opt/icu5c.
После успешного завершения установки, обращаем внимание на рекомендацию подключения нового расширения:
You should add «extension=intl.so» to php.ini
Добавляем строку extension=intl.so в файл /etc/php.ini и перезапускаем веб-сервер: systemctl restart httpd.
Проверяем результат
Проверяем установленные версии PHP и ICU
PHP: 5.6.13 ICU: 55.1
Проверяем формирование даты компонентом yii2 formatter
UTC: 7:32:03 Europe/Moscow: 10:32:03
В итоге мы получили свежую версию библиотеки ICU и адекватную работу крутого php-фреймворка Yii 2.0.
подскажите для ubuntu как будет выглядить?
Примерно так же и будет. Нет убунты под рукой для проверки.
cd source &&
./configure --prefix=/usr &&
make &&
make install
или что-то не собирается?
Подскажите, на CentOS 7, после команды
pecl install intl
получаю ошибку:
running: make
/bin/sh /var/tmp/pear-build-rootc2tZHu/intl-3.0.0/libtool —mode=compile cc -I/opt/icu5c/include -Wno-write-strings -I. -I/var/tmp/intl -DPHP_ATOM_INC -I/var/tmp/pear-build-rootc2tZHu/intl-3.0.0/include -I/var/tmp/pear-build-rootc2tZHu/intl-3.0.0/main -I/var/tmp/intl -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib -I/opt/icu5c/include -DHAVE_CONFIG_H -g -O2 -c /var/tmp/intl/php_intl.c -o php_intl.lo
libtool: compile: cc -I/opt/icu5c/include -Wno-write-strings -I. -I/var/tmp/intl -DPHP_ATOM_INC -I/var/tmp/pear-build-rootc2tZHu/intl-3.0.0/include -I/var/tmp/pear-build-rootc2tZHu/intl-3.0.0/main -I/var/tmp/intl -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib -I/opt/icu5c/include -DHAVE_CONFIG_H -g -O2 -c /var/tmp/intl/php_intl.c -fPIC -DPIC -o .libs/php_intl.o
In file included from /var/tmp/intl/php_intl.h:34:0,
from /var/tmp/intl/php_intl.c:25:
/var/tmp/intl/intl_error.h:24:40: fatal error: ext/standard/php_smart_str.h: No such file or directory
#include
^
compilation terminated.
make: *** [php_intl.lo] Error 1
ERROR: `make’ failed