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

DateTime与IntlDateFormatter时区转换结果不一致,哪个正确?

时区转换结果差异原因及正确用法

差异根源:CST时区缩写的歧义问题

CST是一个存在多义性的时区缩写,它可代表以下几种完全不同的时区:

  • 美国中部标准时间(UTC-6)
  • 古巴标准时间(UTC-5)
  • 中国标准时间(UTC+8)

PHP的DateTimeZone与IntlDateFormatter依赖的底层实现不同,对CST的解析逻辑不一致:

  • DateTimeZone:将CST解析为美国中部标准时间(UTC-6),因此UTC时间2023-09-08 06:00:00减去6小时,得到2023-09-08 00:00:00。
  • IntlDateFormatter:依赖ICU库,默认将CST解析为古巴标准时间(UTC-5),因此UTC时间减去5小时,得到2023-09-08 01:00。

哪一个是正确的?

没有绝对正确的答案——因为CST本身的歧义属性,两种解析都符合缩写的定义。如果你的需求对应某一具体时区,必须使用IANA标准时区标识符,而非模糊的缩写:

  • 表示中国标准时间:用Asia/Shanghai
  • 表示美国中部时间:用America/Chicago
  • 表示古巴标准时间:用America/Havana

修改后的示例代码

使用IANA时区标识符替换CST后,两种方式的结果会完全一致:

$date = new DateTime('2023-09-08 06:00:00.0', new DateTimeZone('UTC'));

echo $date->format('Y-m-d H:i:s') . '<br>';

// 以中国标准时间为例,使用Asia/Shanghai
$formatter = new IntlDateFormatter(
    'en', 
    IntlDateFormatter::SHORT, 
    IntlDateFormatter::SHORT, 
    'Asia/Shanghai', 
    IntlDateFormatter::GREGORIAN,
    'YYYY-MM-dd HH:mm'
);
echo $formatter->format($date) . '<br>';

$date->setTimezone(new DateTimeZone('Asia/Shanghai'));
echo $date->format('Y-m-d H:i:s');

输出结果统一为:

2023-09-08 06:00:00
2023-09-08 14:00
2023-09-08 14:00:00

内容的提问来源于stack exchange,提问作者Dev devovs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 13:00:08