[使用DateTime::modify
方法添加一个月时,结果跳过2月。
2020-02-31
?2020-02-29
? (每月的最后一天)。$date = new DateTime("2020-01-31");
echo $date->modify("+1 month")->format("Y-m-d"); // 2020-03-02
PHP DateTime::modify("+n month")
在当日增加28至31天,具体取决于月份和年份。
我建议您使用modify
和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
从月份的第一天开始增加将[[从不引起二月的问题”,这是一个相当普遍的情况,认为PHP DateTime将从2020-02-29
中聪明地增加一个月并输出2020-03-31
。
PHP将把给定月份中确切的天数添加到当前日期。
因此,如果您从一个月的最后一天。例如:
让我们从三月的最后一天(31日)开始增加一个月。
由于当前月(3月)中有31天,因此PHP将自日期起增加31天。从2020-03-31
开始增加31天将导致跳过整个4月。
$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