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