PHP DateTime类在2024-05-31计算前后月份时返回错误结果
问题分析与解决方案
这是PHP DateTime类处理月份增减的固有逻辑问题,并非PHP版本更新导致的新bug,之前插件没触发是因为没碰到月末31号的场景。
原因说明
当你在5月31日执行modify("next month")或"+1 month"时,PHP会先将月份加1得到6月31日,但6月只有30天,系统会自动将日期滚动到下一个有效日期——7月1日,所以格式化后显示July;同理,5月31日执行"-1 month"会得到4月31日,4月只有30天,滚动到5月1日,显示May。
修复方案
要得到预期的月份,需要调整modify的参数,指定具体的日期锚点:
1. 获取下一个月(预期六月)
使用first day of next month或last day of next month,确保日期停留在目标月份内:
$tz1 = new DateTimeZone('UTC'); $dt1 = new DateTime('31.05.2024', $tz1); // 方式1:跳到下月初 $dt1->modify("first day of next month"); echo $dt1->format("F"); // 输出June // 方式2:跳到下月末(如果需要保持月末日期) $dt1->modify("last day of next month"); echo $dt1->format("F"); // 输出June
2. 获取上一个月(预期四月)
使用last day of previous month,确保日期停留在目标月份:
$tz2 = new DateTimeZone('UTC'); $dt2 = new DateTime('31.05.2024', $tz2); $dt2->modify("last day of previous month"); echo $dt2->format("F"); // 输出April
补充说明
这个日期滚动逻辑在PHP 5.2及以上版本就存在,插件运行4年未出现问题,大概率是近期用户的使用场景中首次出现了5月31日这类月末31号的日期,才触发了这个逻辑问题。
内容的提问来源于stack exchange,提问作者tinchev
相关产品推荐
相关产品推荐

