You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 05:54:02