PHP Carbon set timezone offset增加了几个小时

时间:2018-01-04 12:14:26

标签: php date time php-carbon

我有一个碳对象 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",
   }

1 个答案:

答案 0 :(得分:0)

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

如果您坚持使用早期版本,则会在错误报告的评论中提及一种解决方法,即在getTimestamp()方法之间调用setTimezone()

$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