PHP DateTime时区转换结果异常:CST转UTC时间不符
解决CST转UTC时区的错误问题
嘿,我来帮你搞定这个时区转换的bug!你的问题根源其实有两个:模糊的时区缩写CST,还有格式字符串的小失误,咱们一步步拆解:
1. 为什么你的代码输出错误?
你预期10:56 PM CST转UTC是次日3:56 AM,但代码输出了4:56 AM,核心问题是PHP对CST这个缩写的解析和你想的不一样:
- 你心里的
CST应该是北美中部夏令时(实际标准缩写是CDT,对应UTC-5),10:56 PM UTC-5加5小时就是次日3:56 AM UTC,完全符合你的预期。 - 但PHP默认会把
CST解析成北美中部标准时间(UTC-6),10:56 PM UTC-6加6小时就是次日4:56 AM UTC,这正好是你得到的错误结果!
另外,你用的格式+h是12小时制的小时,没有补零,这也是为什么输出里会出现+04(UTC时区的凌晨4点,12小时制的小时是4)。
2. 修正方案
第一步:换掉模糊的时区缩写
永远别用CST这种歧义性极强的缩写!改用IANA标准时区标识符,比如:
- 如果是北美中部夏令时/标准时(自动切换):用
America/Chicago - 如果是固定UTC-5偏移:用
Etc/GMT+5(注意Etc时区的符号是反向的,GMT+5对应UTC-5)
第二步:修正格式字符串
把+h改成+H(24小时制小时,带补零),或者用P输出标准的时区偏移格式(比如+00:00)。
修正后的代码示例
情况1:转成UTC时区(得到你预期的3:56 AM)
$datetime = '08/22/2015 10:56 PM'; // 用明确的时区代替模糊的CST $tz_from = 'America/Chicago'; $tz_to = 'UTC'; // 用+H输出24小时制的时区偏移,或者用P输出标准格式 $format = 'Y-m-d H:i:s +H'; $dt = new DateTime($datetime, new DateTimeZone($tz_from)); $dt->setTimeZone(new DateTimeZone($tz_to)); echo $dt->format($format); // 输出:2015-08-23 03:56:00 +00
情况2:如果你确实需要输出+04(转成UTC+4时区)
如果你的预期结果里的+04是要转成UTC+4时区,那调整目标时区即可:
$datetime = '08/22/2015 10:56 PM'; $tz_from = 'America/Chicago'; $tz_to = 'Etc/GMT-4'; // 对应UTC+4时区 $format = 'Y-m-d H:i:s +H'; $dt = new DateTime($datetime, new DateTimeZone($tz_from)); $dt->setTimeZone(new DateTimeZone($tz_to)); echo $dt->format($format); // 输出:2015-08-23 03:56:00 +04
小提醒
时区缩写坑很多,比如CST同时可以代表中国标准时间(UTC+8)、北美中部标准时间(UTC-6)、澳大利亚中部标准时间(UTC+9:30),所以一定要用IANA时区标识符来避免歧义!
内容的提问来源于stack exchange,提问作者user9715332
相关产品推荐
相关产品推荐

