У меня есть проект CakePHP 3 с такими конфигурациями:
приложение.php:
'defaultLocale' => env('APP_DEFAULT_LOCALE', 'pt_BR'),
'defaultTimezone' => env('APP_DEFAULT_TIMEZONE', 'America/Sao_Paulo'),
bootstrap.php
date_default_timezone_set('America/Sao_Paulo');
Когда я
echo date("Y-m-d H:i:s");
показывает правильную дату и время;
Но когда я
$data = Time::now();
а также
echo $data;
Он показан с +1 часом, потому что раньше мы добавляли один час на летнее время, но в этом году его отменили.
Странно то, что когда я отлаживаю $data
, он показывает правильно, без +1 часа:
\src\Controller\TesteController.php (line 104)
object(Cake\I18n\Time) {
'time' => '2019-10-24T15:15:07-03:00',
'timezone' => 'America/Sao_Paulo',
'fixedNowTime' => false
}
echo data:24/10/2019 16:15:07`
Я пытался добавить часовой пояс с помощью
$dateTimeZoneBrasil = new \DateTimeZone("America/Sao_Paulo");
а также
$data = Time::now($dateTimeZoneBrasil);
Но все равно показывает с +1 час.
ОБНОВЛЕНИЕ
Вот тесты для воспроизведения проблемы:
ini_set('intl.default_locale', 'pt_BR');
I18n::locale('pt_BR');
date_default_timezone_set('America/Sao_Paulo');
Time::setToStringFormat([\IntlDateFormatter::SHORT, \IntlDateFormatter::SHORT]);
$time = Time::now();
debug($time);
debug((string)$time);
debug($time->i18nFormat());
debug($time->i18nFormat('yyyy-MM-dd HH:mm:ss'));
debug($time->format('Y-m-d H:i:s'));
debug($time->getTimezone()->getTransitions(strtotime('2019-01-01'), strtotime('2020-01-01')));
phpinfo(INFO_MODULES);
И мои результаты:
\src\Controller\TesteController.php (line 79)
object(Cake\I18n\Time) {
'time' => '2019-10-25T09:34:37-03:00',
'timezone' => 'America/Sao_Paulo',
'fixedNowTime' => false
}
\src\Controller\TesteController.php (line 80)
'25/10/19 10:34'
\src\Controller\TesteController.php (line 81)
'25/10/19 10:34'
\src\Controller\TesteController.php (line 82)
'2019-10-25 10:34:37'
\src\Controller\TesteController.php (line 83)
'2019-10-25 09:34:37'
\src\Controller\TesteController.php (line 84)
[
(int) 0 => [
'ts' => (int) 1546308000,
'time' => '2019-01-01T02:00:00+0000',
'offset' => (int) -7200,
'isdst' => true,
'abbr' => '-02'
],
(int) 1 => [
'ts' => (int) 1550368800,
'time' => '2019-02-17T02:00:00+0000',
'offset' => (int) -10800,
'isdst' => false,
'abbr' => '-03'
],
(int) 2 => [
'ts' => (int) 1572750000,
'time' => '2019-11-03T03:00:00+0000',
'offset' => (int) -7200,
'isdst' => true,
'abbr' => '-02'
]
]
Модули:
date
date/time support enabled
"Olson" Timezone Database Version 2018.7
Timezone Database external
Default timezone America/Sao_Paulo
Directive Local Value Master Value
date.default_latitude 31.7667 31.7667
date.default_longitude 35.2333 35.2333
date.sunrise_zenith 90.583333 90.583333
date.sunset_zenith 90.583333 90.583333
date.timezone America/Sao_Paulo America/Sao_Paulo
-02:00
) для Бразилии было первым воскресеньем ноября (по состоянию на 2018 год), а окончание летнего времени (т.е.-03:00
) было третьим. Воскресенье февраля. Таким образом, даже если бы летнее время все еще существовало, в настоящее время вы все равно были бы без летнего времени (-03:00
). Глядя на информацию о переходе, правильно видно, как выглядели переходы, и он правильно показывает, что в настоящее время он находится в диапазоне, отличном от летнего времени. - person ndm   schedule 25.10.201909:34:37
, форматирование INTL показывает неправильный результат, т.е.10:34:37
. Я предлагаю протестировать его с новым пустым проектом CakePHP (используя самую последнюю версию CakePHP) и убедиться, что ваши библиотеки INTL и ICU обновлены. У меня gist.github.com/ndm2/231a5277a617e5d304987f13bc794947 работает нормально . Обновление базы данных часовых поясов также не повредит, и я не уверен, действительно ли это необходимо, но похоже, что вам не хватаетtimelib
? - person ndm   schedule 25.10.20192019-11-03T03:00:00+0000
. Возможно, вы используете устаревшую библиотеку INTL / ICU, которая не знает об этом изменении, это мое лучшее предположение, но я действительно просто стреляю в темноту. - person ndm   schedule 25.10.2019