【问题标题】:Weird behavior PHP DateTime and DateTimeZone奇怪的行为 PHP DateTime 和 DateTimeZone
【发布时间】: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 不是同一个时区。

标签: php datetime timezone utc


【解决方案1】:

输出是正确的。

法国在 10 月 25 日改为冬令时,而 CET 等大多数缩写时区没有 DST 规则。

像法国这样的国家一年中有 6 个月在 CET,而其他 6 个月是 CET。缩写的时区令人困惑,所以一般我只是建议人们不要使用它们。

echo (new DateTime('2020-10-01', new DateTimeZone('Europe/Paris')))->format('T'), "\n";
echo (new DateTime('2020-11-01', new DateTimeZone('Europe/Paris')))->format('T'), "\n";

输出:

CEST
CET

【讨论】:

    猜你喜欢
    • 2014-09-30
    • 2017-08-29
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 2016-06-17
    相关资源
    最近更新 更多