Страница 1 из 1
Как сконфигурировать Yii::$app->formatter
Добавлено: 2014.10.02, 14:35
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
Теперь суть проблемы:
В базе есть запись
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
Re: Как сконфигурировать Yii::$app->formatter
Добавлено: 2014.10.02, 18:10
samdark
Re: Как сконфигурировать Yii::$app->formatter
Добавлено: 2014.10.03, 08:26
chesar
Код: Выделить всё
>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 - вообще ничего не решает.
Re: Как сконфигурировать Yii::$app->formatter
Добавлено: 2014.10.03, 08:38
yiijeka
А экспериментировали? Ну там my.conf в +2 ставили?...От куда то оно берёт это +4
И что значит не решает обновление, обновитесь до текущей master. А потом уже смотрите...
Re: Как сконфигурировать Yii::$app->formatter
Добавлено: 2014.10.03, 09:27
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, в региональных тоже всё норм.
Re: Как сконфигурировать Yii::$app->formatter
Добавлено: 2014.10.03, 09:42
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() скармливать то норм, а вот со строкой начинаются проблемы.
Re: Как сконфигурировать Yii::$app->formatter
Добавлено: 2014.10.03, 11:08
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).
Re: Как сконфигурировать Yii::$app->formatter
Добавлено: 2014.10.03, 16:29
zelenin
парсят время в контексте юникстайм, а юникстайм в UTC
Re: Как сконфигурировать Yii::$app->formatter
Добавлено: 2014.10.04, 21:45
chesar
zelenin писал(а):парсят время в контексте юникстайм, а юникстайм в UTC
Спасибо! Я не правильно понимал принцип обработки дат.