Cake\I18n\Time 对象回显错误的时间加上夏令时
Cake\I18n\Time object echoes wrong hour plus daylight saving time
我有一个具有这些配置的 CakePHP 3 项目:
app.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
问题出在应用程序 运行 所在的操作系统中。 DST 的时区规则已过时。巴西最近更改了夏令时规则。但其他政府也可以随时这样做。
IANA 组织维护着一个具有时区和其他特征的最新银行。最新版本为2019c,发表于2019-09-11 [1].
CAKEPHP 框架使用 PHP INTL 库。 PHP INTL 库使用 ICU 库,它是 Linux 分发包 [2] 的一部分。 ICU 库使用 IANA 数据。
因此,过时版本的 ICU 会影响 PHP 处理日期的方式。
您可以在 phpinfo() 或使用以下命令查看 ICU 版本:
php -i | grep ICU
ICU库最新版本为65.1,发布于2019-10-03[3] and doesn't include IANA version 2019c. However, you can see that in the ICU repository they have already updated the zoneinfo64.txt file for future releases [4].
CentOS 8 上最新的 ICU 版本是 60.5 [5]. If you are in the Amazon AMI distribution (EC2, EBS, RDS) it will be even worse as the latest version (2018-05-14) of ICU for their distribution is 50.1.2 [6]. The latter has a release date at 2012-12-17 [7]
如果您是下载和编译Linux服务的行家,您可以使用最新的源代码编译ICU包。
如果可以接受大纲方案,可以暂时使用America/Fortaleza时区,而不是America/Sao_Paulo。福塔莱萨地区自 2012 年起不属于夏令时。
我有一个具有这些配置的 CakePHP 3 项目:
app.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
问题出在应用程序 运行 所在的操作系统中。 DST 的时区规则已过时。巴西最近更改了夏令时规则。但其他政府也可以随时这样做。
IANA 组织维护着一个具有时区和其他特征的最新银行。最新版本为2019c,发表于2019-09-11 [1].
CAKEPHP 框架使用 PHP INTL 库。 PHP INTL 库使用 ICU 库,它是 Linux 分发包 [2] 的一部分。 ICU 库使用 IANA 数据。
因此,过时版本的 ICU 会影响 PHP 处理日期的方式。
您可以在 phpinfo() 或使用以下命令查看 ICU 版本:
php -i | grep ICU
ICU库最新版本为65.1,发布于2019-10-03[3] and doesn't include IANA version 2019c. However, you can see that in the ICU repository they have already updated the zoneinfo64.txt file for future releases [4].
CentOS 8 上最新的 ICU 版本是 60.5 [5]. If you are in the Amazon AMI distribution (EC2, EBS, RDS) it will be even worse as the latest version (2018-05-14) of ICU for their distribution is 50.1.2 [6]. The latter has a release date at 2012-12-17 [7]
如果您是下载和编译Linux服务的行家,您可以使用最新的源代码编译ICU包。
如果可以接受大纲方案,可以暂时使用America/Fortaleza时区,而不是America/Sao_Paulo。福塔莱萨地区自 2012 年起不属于夏令时。