PHP DateTime::modify("+n month")
在当天基础上添加 28 到 31 天,具体取决于月份和年份。
Solution
我建议您使用以下方法从该月的第一天开始增加月份modify
and format
方法:
// Instanciates the DateTime object.
$date = new DateTime("2020-01-01");
// Adds a month to the date.
$date->modify("+1 month"); // 2020-02-01
// Format the date with "t" (gets the last day of the month).
$date->format("Y-m-t"); // 2020-02-29
从该月的第一天开始递增never提高二月问题这是相当常见的,认为 PHP DateTime 会智能地添加一个月2020-02-29
和输出2020-03-31
.
为什么会发生这种情况?
In the 公历, the 平均一个月的长度是 30.436875 天:
- 4月、6月、9月、11月30天;
- 一月、三月、五月、七月、八月、十月、十二月共31天;
- 28天或29天(在闰年) 二月里。
PHP 会将给定月份的确切天数添加到当前日期。
因此,如果您从第一个增量开始递增,PHP 将在第一次增量后调整日期
该月的最后一天。
E.g.:
让我们从 3 月的最后一天(31 日)开始添加一个月。
由于当前月份(3 月)有 31 天,PHP 将增加 31 天到该日期。添加 31 天2020-03-31
将导致跳过整个四月。
$date = new DateTime("2020-03-31"); // 2020-03-31
echo $date->modify("+1 month")->format("Y-m-d"); // 2020-05-01 | Added 31 days (since March has 31 days).
echo $date->modify("+1 month")->format("Y-m-d"); // 2020-06-01 | Added 31 days (since the new date is May 1st, which is a month with 31 days).
echo $date->modify("+1 month")->format("Y-m-d"); // 2020-07-01 | Added 30 days
现在,我们在 4 月的最后一天(30 日)添加一个月。
我们可以看到,由于接下来的几个月都有 30 多天,最后一天将保持不变,直到第二年2月。由于 2 月总是有 28 到 29 天,因此加上 31 天就过了这个月,结果日期就是 3 月 2 日。
$date = new DateTime("2020-04-30");
echo $date->modify("+1 month")->format("Y-m-d"); // 2020-05-30 | Added 30 days.
echo $date->modify("+1 month")->format("Y-m-d"); // 2020-06-30 | Added 31 days.
echo $date->modify("+1 month")->format("Y-m-d"); // 2020-07-30 | Added 30 days.
// ...
echo $date->modify("+1 month")->format("Y-m-d"); // 2021-01-30 | Added 31 days
echo $date->modify("+1 month")->format("Y-m-d"); // 2021-03-02 | Added 31 days (since January has 31 days).
echo $date->modify("+1 month")->format("Y-m-d"); // 2021-04-02 | Added 31 days (since the new date is March 2nd, which is a month with 31 days).
这就是为什么建议从该月的第一天开始增加月份,
自从1st对所有月份都是通用的。
$date = new DateTime("2020-01-01"); // 2020-01-01
echo $date->modify("+1 month")->format("Y-m-d"); // 2020-02-01 | Added 31 days
echo $date->modify("+1 month")->format("Y-m-d"); // 2020-03-01 | Added 29 days (since 2020 is leap year, yee haw).
echo $date->modify("+1 month")->format("Y-m-d"); // 2020-04-01 | Added 31 days