PHP中UTC转CST结果与在线工具不符,求正确转换方法
UTC转CST时间差1小时的问题排查与解决
我来帮你捋清楚这个问题——核心原因在于CST这个时区缩写本身存在歧义,不同地区的CST对应的时区偏移完全不一样:
- 美国中部标准时间(Central Standard Time):非夏令时为UTC-6,夏令时(CDT)切换为UTC-5
- 中国标准时间(China Standard Time):固定为UTC+8
- 还有澳大利亚中部标准时间等其他变体
你用在线工具得到的05/29/2018 6:44 AM,对应的是美国中部夏令时(UTC-5);但PHP里直接传入'CST'作为时区参数时,默认解析的是美国中部标准时间(UTC-6),这就导致了结果差1小时。
解决方法:使用无歧义的IANA时区标识符
PHP的DateTimeZone支持IANA官方时区标识符,这些标识符不会有歧义,推荐优先使用:
- 美国中部时区(自动识别夏令时切换):
America/Chicago - 中国标准时间:
Asia/Shanghai
修改你的函数调用,把模糊的'CST'替换成对应的明确标识符即可:
function date_convert($dt, $tz1, $df1, $tz2, $df2) { // 创建DateTime对象 $d = DateTime::createFromFormat($df1, $dt, new DateTimeZone($tz1)); // 转换时区 $d->setTimeZone(new DateTimeZone($tz2)); // 转换日期格式并返回 return $d->format($df2); } // 转换为美国中部夏令时(和在线工具结果一致) echo date_convert('2018-05-29 11:44:00', 'UTC', 'Y-m-d H:i:s', 'America/Chicago', 'Y-m-d H:i:s'); // 输出:2018-05-29 06:44:00
如果你的需求是转换为中国标准时间,就用'Asia/Shanghai':
echo date_convert('2018-05-29 11:44:00', 'UTC', 'Y-m-d H:i:s', 'Asia/Shanghai', 'Y-m-d H:i:s'); // 输出:2018-05-29 19:44:00
补充说明
2018年5月29日处于美国中部的夏令时时段(每年3月第二个周日到11月第一个周日),使用America/Chicago会自动切换到UTC-5的偏移,和在线工具的结果完全匹配;而直接用'CST'会强制使用UTC-6的标准时间,自然就差了1小时。
内容的提问来源于stack exchange,提问作者Jenz
相关产品推荐
相关产品推荐

