You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 20:10:27