【问题标题】:PHP Carbon set timezone offset adds hoursPHP Carbon 设置时区偏移量增加小时数
【发布时间】:2018-01-04 12:14:25
【问题描述】:

我有一个碳对象new Carbon,然后在其上调用->setTimezone() 方法。

当我使用 Europe/London 等时区字符串的值调用该方法时,我可以根据需要多次调用该方法,而不会出现任何问题。
但是,如果我使用 +02:00 的值调用它,则每次调用该方法都会增加 2 个小时的时间。它只发生在无类型 3 时区。
为什么会发生这种情况,我该如何解决?

代码显示问题:

$c = new Carbon()

=> Carbon\Carbon {#1942
     +"date": "2018-01-04 14:21:57.000000",
     +"timezone_type": 3,
     +"timezone": "UTC",
   }

$c->setTimezone('+02:00')->setTimezone('+02:00')->setTimezone('UTC')

=> Carbon\Carbon {#1942
     +"date": "2018-01-04 18:21:57.000000",
     +"timezone_type": 3,
     +"timezone": "UTC",
   }

【问题讨论】:

  • 你有重现它的代码吗?
  • 添加了重现问题的代码示例

标签: php date time php-carbon


【解决方案1】:

这是 PHP (https://bugs.php.net/bug.php?id=72338) 中的一个错误,已在 PHP 7(7.0.17 和 7.1.3)中修复。

如果您卡在较早的版本上,错误报告的 cmets 中提到了一种解决方法,即在 setTimezone() 方法之间调用 getTimestamp()

$utc = new DateTimeZone('UTC');
$plus200 = new DateTimeZone('+02:00');

$date = new DateTime('2018-06-14 09:15:00', $utc);

echo $date->format('Y-m-d H:i:s'); // 2018-06-14 09:15:00

$date->setTimezone($plus200);
$date->setTimezone($plus200);
$date->setTimezone($utc);

echo $date->format('Y-m-d H:i:s'); // 2018-06-14 13:15:00

$date = new DateTime('2018-06-14 09:15:00', $utc);

$date->getTimestamp();
$date->setTimezone($plus200);
$date->getTimestamp();
$date->setTimezone($plus200);
$date->getTimestamp();
$date->setTimezone($utc);

echo $date->format('Y-m-d H:i:s'); // 2018-06-14 09:15:00

带有不同版本输出的测试脚本:https://3v4l.org/cXZYC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    相关资源
    最近更新 更多