PHP strtotime累加月份异常:每月首日计算结果与预期不符
问题根因
strtotime对不同分隔符的日期存在默认解析歧义:
当日期字符串用-作为分隔符时,strtotime会默认按日-月-年逻辑解析;但如果分隔符是/,则会默认按美式月/日/年逻辑解析。
你第一次循环时将日期格式化为d/m/Y(日/月/年)后,再传给下一轮的strtotime解析就会出现识别错误:比如第一次输出得到的01/10/2021,会被strtotime误认为是2021年1月10日,而非预期的2021年10月1日,后续所有日期计算全部错乱。- 直接修改原始日期变量的存储格式,导致后续运算的数据源本身就有歧义,错误会持续累加。
修复方案
方案1:运算过程保持日期格式统一,仅输出时转格式
运算过程始终用-分隔的格式,避免解析歧义,输出时再转成/格式:
$begin_date_2021_2022 = '01-09-2021'; for ($i = 0; $i < 5; $i++) { $begin_date_2021_2022 = date('d-m-Y', strtotime('+1 month', strtotime($begin_date_2021_2022))); echo date('d/m/Y', strtotime($begin_date_2021_2022)) . "<br>"; }
方案2:使用DateTime类运算,彻底规避解析歧义
更推荐使用DateTime类处理日期,逻辑更清晰,不会出现格式识别问题:
$date = DateTime::createFromFormat('d-m-Y', '01-09-2021'); for ($i = 0; $i < 5; $i++) { $date->modify('+1 month'); echo $date->format('d/m/Y') . "<br>"; }
两种方案都可以输出你预期的结果。
内容的提问来源于stack exchange,提问作者Altan A.
相关产品推荐
相关产品推荐

