PHP时区Bug:America/Santiago时区凌晨1点前时间被加1小时
问题:America/Santiago时区下凌晨1点前的时间被自动加1小时
问题原因
这是智利夏令时(DST)切换导致的规则性时间修正。
2022年9月4日是智利当年夏令时启动的日期,当地时区规则会在当天凌晨00:00直接将时钟拨快1小时到01:00,也就是说原有的00:00-01:00这个时间段在该时区的时间体系里是不存在的。PHP的日期解析函数会自动处理这种无效时间,将其映射到下一个有效的时间点,也就是直接加1小时。
验证场景
- 当输入
04/09/2022 00:32:27时,这个时间落在被“跳过”的无效区间内,因此被自动修正为01:32:27 - 输入
04/09/2022 01:22:11时,该时间已经是夏令时切换后的有效时间,所以不会被调整
处理建议
如果需要精准控制这类无效时间的解析逻辑,可以尝试以下方式:
- 解析时显式指定时区参数,避免依赖全局时区设置:
$timezone = new DateTimeZone('America/Santiago'); $dateTest = DateTime::createFromFormat('d/m/Y H:i:s', '04/09/2022 00:32:27', $timezone);
- 使用
date_get_last_errors()检查解析过程中的警告,确认是否发生了时间修正:
date_default_timezone_set('America/Santiago'); $dateTest = date_create_from_format('d/m/Y H:i:s', '04/09/2022 00:32:27'); print_r(date_get_last_errors());
该函数会返回包含warning_count和warnings的数组,提示你时间是否因为时区规则被调整。
内容的提问来源于stack exchange,提问作者Uzias Astrea
相关产品推荐
相关产品推荐

