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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:43:18