PHP DateTime modify方法异常:2022/03/27 02时缺失问题问询
为什么PHP DateTime计算时缺失了2022/03/27 02时?
核心原因:夏令时(DST)切换
2022年3月27日是欧洲部分实行夏令时的地区(如伦敦、巴黎等时区)的时钟切换日:当地时间凌晨2点时,时钟会直接拨快1小时到凌晨3点,2022/03/27 02:00:00这个时间点在对应时区下是不存在的。
你的PHP环境默认时区应该设置为了这类夏令时时区,当代码执行$from->modify('+1 hour')从01:00:00增加1小时时,DateTime类会自动跳过不存在的02点,直接跳转到03点,因此输出结果里没有02时的记录。
验证时区影响
可以通过以下代码查看当前PHP的默认时区,确认是否为夏令时时区:
echo date_default_timezone_get();
如果输出是Europe/London、Europe/Paris等,即可验证该原因。
解决方法
如果需要生成包含所有逻辑小时的列表(即使该时间在时区中不存在),可以改用UTC时区计算(UTC无夏令时切换):
$from = new DateTime('2022/03/27 00:00:00', new DateTimeZone('UTC')); $to = new DateTime('2022/03/27 23:59:59', new DateTimeZone('UTC')); do { echo $from->format('Y/m/d H') . "\n"; $from->modify('+1 hour'); } while ($from->getTimestamp() < $to->getTimestamp());
若需要基于本地时区展示,但要包含逻辑上的02点,也可以手动构造时间字符串,而非依赖modify方法自动计算。
内容的提问来源于stack exchange,提问作者jhernandis
相关产品推荐
相关产品推荐

