PHP DateTime设置时区后format显示时间不符?原因及解决方法
问题
尝试以特定格式显示DateTime,但显示时时间被修改:
$opened_at = \DateTime::createFromFormat('Y-m-d H:i:s', '2022-12-04 19:12:31'); $opened_at->setTimezone(new \DateTimeZone('Europe/Paris')); echo $opened_at->format('d/m/Y h:i');
预期输出:
04/12/2022 19:12
实际输出:
04/12/2022 08:12
原因分析
- 时区转换逻辑错误:
createFromFormat默认将解析出的时间对象设为服务器默认时区,而非传入字符串对应的时区。调用setTimezone时,PHP会把服务器时区下的19:12转换为巴黎时区的时间,导致时间值变更。 - 格式符误用:使用了
h格式符(12小时制小时数,范围01-12),实际输出的08:12是12小时制显示,和预期的24小时制19:12混淆。
解决方法
1. 正确设置原始时间时区
创建DateTime对象时,直接指定传入时间字符串对应的时区(假设原始时间为巴黎时区):
$opened_at = \DateTime::createFromFormat( 'Y-m-d H:i:s', '2022-12-04 19:12:31', new \DateTimeZone('Europe/Paris') ); echo $opened_at->format('d/m/Y H:i');
若原始时间为其他时区(如UTC),先指定原始时区再转换:
$opened_at = \DateTime::createFromFormat( 'Y-m-d H:i:s', '2022-12-04 19:12:31', new \DateTimeZone('UTC') ); $opened_at->setTimezone(new \DateTimeZone('Europe/Paris')); echo $opened_at->format('d/m/Y H:i');
2. 使用正确的格式符
用大写H表示24小时制小时数(00-23),匹配预期的19:12;避免用小写h(12小时制),防止显示混淆。
内容的提问来源于stack exchange,提问作者naspy971
相关产品推荐
相关产品推荐

