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
相关产品推荐
相关产品推荐

