【发布时间】:2021-03-03 03:01:21
【问题描述】:
PHP DateTime 和 DateTimeZone 在 DST 更改日期前后无法正常工作。
我编写了一个简单的函数来将本地时间转换为 UTC,并使用从 10 月 24 日到 11 月 2 日的午夜时间来调用它,时区为 Europe/Paris 和 CET:
<?php
function timeToUTC($time, $timeZone, $format='Y-m-d H:i:sP')
{
$dt = new DateTime($time, new DateTimeZone($timeZone));
$dt->setTimeZone(new DateTimeZone('UTC'));
return $dt->format($format);
}
$localTimes = [
'2020-10-24 00:00:00',
'2020-10-25 00:00:00',
'2020-10-26 00:00:00',
'2020-10-27 00:00:00',
'2020-10-28 00:00:00',
'2020-10-29 00:00:00',
'2020-10-30 00:00:00',
'2020-10-31 00:00:00',
'2020-11-01 00:00:00',
'2020-11-02 00:00:00',
];
foreach (['Europe/Paris', 'CET'] as $timeZone) {
echo "******** $timeZone ********" . PHP_EOL;
foreach ($localTimes as $localTime) {
$utcTime = timeToUTC($localTime, $timeZone);
echo "$localTime $utcTime" . PHP_EOL;
}
}
输出:
******** Europe/Paris ********
2020-10-24 00:00:00 2020-10-23 22:00:00+00:00
2020-10-25 00:00:00 2020-10-24 22:00:00+00:00
2020-10-26 00:00:00 2020-10-25 23:00:00+00:00
2020-10-27 00:00:00 2020-10-26 23:00:00+00:00
2020-10-28 00:00:00 2020-10-27 23:00:00+00:00
2020-10-29 00:00:00 2020-10-28 23:00:00+00:00
2020-10-30 00:00:00 2020-10-29 23:00:00+00:00
2020-10-31 00:00:00 2020-10-30 23:00:00+00:00
2020-11-01 00:00:00 2020-10-31 23:00:00+00:00
2020-11-02 00:00:00 2020-11-01 23:00:00+00:00
******** CET ********
2020-10-24 00:00:00 2020-10-23 23:00:00+00:00
2020-10-25 00:00:00 2020-10-24 23:00:00+00:00
2020-10-26 00:00:00 2020-10-25 23:00:00+00:00
2020-10-27 00:00:00 2020-10-26 23:00:00+00:00
2020-10-28 00:00:00 2020-10-27 23:00:00+00:00
2020-10-29 00:00:00 2020-10-28 23:00:00+00:00
2020-10-30 00:00:00 2020-10-29 23:00:00+00:00
2020-10-31 00:00:00 2020-10-30 23:00:00+00:00
2020-11-01 00:00:00 2020-10-31 23:00:00+00:00
2020-11-02 00:00:00 2020-11-01 23:00:00+00:00
对于Europe/Paris,我在 10 月 31 日 26 日收到了更改后的 DST。甚至值得CET 时区没有任何变化。
我做错了什么?是关于 PHP 的错误吗?
这是关于 Ubuntu 上的 PHP 的。我尝试了带有 PHP 7.2.34-8 的 Ubuntu 16.04 和带有 7.2.24-0 的 Ubuntu 18.04。
【问题讨论】:
-
您能解释一下为什么您认为这是错误的吗?两者都检查了,这是我期望输出的 100%。
-
我看到两个问题: 1:今年10月31日更改了夏令时。所以直到 10 月 31 日,我应该得到前一天 22:00:00,之后是 23:00:00。 2. CET 和 Europe/Paris 是同一时区的简单 2 个名称,它们应该给出相同的结果。
-
否。夏令时到冬令时是2020年10月25日,而不是31日!
-
jspit所说的,CET也不是这样。位于 CET 时区且具有 DST 规则的国家/地区每年 6 个月切换到 CEST。不过,有些非洲国家全年都有 CET。
-
是的,@Evert,Europe/Paris 和 CET 不是同一个时区。