Как сконфигурировать Yii::$app->formatter

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Закрыто
chesar
Сообщения: 514
Зарегистрирован: 2013.04.10, 17:49

Как сконфигурировать Yii::$app->formatter

Сообщение chesar »

Подскажите пожалуйста, как настроить приложение и сервер, чтобы верно выводилась дата? Что есть сейчас:
в конфиге

Код: Выделить всё

return [
   ...,
   'language' => 'ru',
   'charset' => 'utf-8',
   'timeZone' => 'Europe/Moscow',
]
 
в php.ini

Код: Выделить всё

[Date]
date.timezone = "Europe/Moscow"
[intl]
;intl.default_locale =    //--- пробывал и            intl.default_locale = ru
;intl.error_level = E_WARNING
в my.conf

Код: Выделить всё

default_time_zone = "+04:00"
 
Теперь суть проблемы:
В базе есть запись
mysql> SELECT `id`, `datePublicate` FROM `news` WHERE `id`=109240;
+--------+---------------------+
| id | datePublicate |
+--------+---------------------+
| 109240 | 2014-10-02 13:30:26 |
+--------+---------------------+
1 row in set (0.00 sec)
Но если выводить через Yii::$app->formatter->asTime() то прибавляет +4 часа

Код: Выделить всё

echo (new DateTime($item->datePublicate))->format("H:i");  // выведет 13:30
echo Yii::$app->formatter->asTime($item->datePublicate, "php:H:i"); //выведет 17:30
echo Yii::$app->formatter->asTime($item->datePublicate, "KK:mm"); //выведет 5:30 
т.е. я понимаю, что где-то TimeZone перебивается или я не так поставил, не подскажите куда смотреть?
-------------------------------------------------------------------------------------------------
Об'яснено: https://github.com/yiisoft/yii2/issues/ ... t-57802204
Последний раз редактировалось chesar 2014.10.04, 22:14, всего редактировалось 1 раз.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Как сконфигурировать Yii::$app->formatter

Сообщение samdark »

Недавно поправили в master: https://github.com/yiisoft/yii2/commit/ ... f47d94da79
chesar
Сообщения: 514
Зарегистрирован: 2013.04.10, 17:49

Re: Как сконфигурировать Yii::$app->formatter

Сообщение chesar »

Sam Dark писал(а):Недавно поправили в master: https://github.com/yiisoft/yii2/commit/ ... f47d94da79

Код: Выделить всё

>composer show --installed
...
yiisoft/yii2                   dev-master 72c8e6c Yii PHP Framework Version 2
yiisoft/yii2-composer          dev-master 458cae9 The composer plugin for Yii extension installer
...
composer update - вообще ничего не решает.
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Как сконфигурировать Yii::$app->formatter

Сообщение yiijeka »

А экспериментировали? Ну там my.conf в +2 ставили?...От куда то оно берёт это +4

И что значит не решает обновление, обновитесь до текущей master. А потом уже смотрите...
chesar
Сообщения: 514
Зарегистрирован: 2013.04.10, 17:49

Re: Как сконфигурировать Yii::$app->formatter

Сообщение chesar »

yiijeka писал(а):А экспериментировали? Ну там my.conf в +2 ставили?...От куда то оно берёт это +4

И что значит не решает обновление, обновитесь до текущей master. А потом уже смотрите...
Обновился конечно же.

Если в my.conf изменять часовой пояс, то вывод

Код: Выделить всё

echo (new DateTime($item->datePublicate))->format("H:i");  // выведет 13:30
echo Yii::$app->formatter->asTime($item->datePublicate, "php:H:i"); //выведет 17:30
 
изменяется пропорционально. В базе timestamp и часовой пояс должен быть указан корректный. Значит отпадает.

Убираю из конфига 'timeZone' => 'Europe/Moscow' и меняю в php.ini date.timezone
вывод через DateTime - не изменяется, через форматтер - изменяется.
Добавляю в конфиг 'timeZone' => 'Europe/Moscow', в php.ini указываю Europe/Moscow и больше не трогаю. Играю со значением в конфиге.
Результаты такие же как в прошлом тесте. Через DateTime - не изменяется, через formatter - изменяется.
Т.е. получается дело либо где-то в formatter, либо где-то в расширении intl ?

з.ы. в настройках времени винды стоит UTC +04:00, в региональных тоже всё норм.
chesar
Сообщения: 514
Зарегистрирован: 2013.04.10, 17:49

Re: Как сконфигурировать Yii::$app->formatter

Сообщение chesar »

Код: Выделить всё

$date = date("Y-m-d H:i:s", time());
echo (new DateTime($date))->format("Y-m-d H:i:s");   //2014-10-03 10:39:16
echo Yii::$app->formatter->asTime($date, "php:Y-m-d H:i:s");  //2014-10-03 14:39:16
echo Yii::$app->formatter->asTime(time(), "php:Y-m-d H:i:s");  //2014-10-03 10:39:16

echo Yii::$app->formatter->asDatetime($date, "php:Y-m-d H:i:s"); //2014-10-03 14:39:16
echo Yii::$app->formatter->asDatetime($date, "php:Y-m-d H:i:s"); //2014-10-03 10:39:16

echo Yii::$app->formatter->asDatetime(strtotime($date), "php:Y-m-d H:i:s"); //2014-10-03 10:39:16
т.е. если time() скармливать то норм, а вот со строкой начинаются проблемы.
chesar
Сообщения: 514
Зарегистрирован: 2013.04.10, 17:49

Re: Как сконфигурировать Yii::$app->formatter

Сообщение chesar »

Походу баг.
\yii\i18n\Formatter

Код: Выделить всё

protected function normalizeDatetimeValue($value)
    {
        if ($value === null || $value instanceof DateTime) {
            // skip any processing
            return $value;
        }
        if (empty($value)) {
            $value = 0;
        }
        try {
            if (is_numeric($value)) { // process as unix timestamp
                if (($timestamp = DateTime::createFromFormat('U', $value, new DateTimeZone('UTC'))) === false) {
                    throw new InvalidParamException("Failed to parse '$value' as a UNIX timestamp.");
                }
                return $timestamp;
            } elseif (($timestamp = DateTime::createFromFormat('Y-m-d', $value, new DateTimeZone('UTC'))) !== false) { // try Y-m-d format (support invalid dates like 2012-13-01)
                return $timestamp;
            } elseif (($timestamp = DateTime::createFromFormat('Y-m-d H:i:s', $value, new DateTimeZone('UTC'))) !== false) { // try Y-m-d H:i:s format (support invalid dates like 2012-13-01 12:63:12)
                return $timestamp;
            }
            // finally try to create a DateTime object with the value
            $timestamp = new DateTime($value, new DateTimeZone('UTC'));
            return $timestamp;
        } catch(\Exception $e) {
            throw new InvalidParamException("'$value' is not a valid date time value: " . $e->getMessage()
                . "\n" . print_r(DateTime::getLastErrors(), true), $e->getCode(), $e);
        }
    }
 
DateTimeZone('UTC') устанавливается. а надо DateTimeZone($this->timeZone).
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Как сконфигурировать Yii::$app->formatter

Сообщение zelenin »

парсят время в контексте юникстайм, а юникстайм в UTC
chesar
Сообщения: 514
Зарегистрирован: 2013.04.10, 17:49

Re: Как сконфигурировать Yii::$app->formatter

Сообщение chesar »

zelenin писал(а):парсят время в контексте юникстайм, а юникстайм в UTC
Спасибо! Я не правильно понимал принцип обработки дат.
Закрыто