给定日期为2019-12-30
,我想为循环中的每次迭代增加1个月(所以是5次)。
我写了这段代码:
$begin_date = '2019-12-30';
for ($i = 1; $i <= 5; $i++) {
echo '<p>' . $begin_date . '</p>';
$time = strtotime($begin_date);
$begin_date = date("Y-m-d", strtotime("+1 month", $time));
}
我得到了以下结果
2019-12-30
2019-01-30
2019-03-01 invalid -- I would expect 2019-02-28, at least last day
2019-04-01 invalid
2019-05-01 invalid
答案 0 :(得分:6)
您可以使用DateTime对象,然后将其修改为下个月的最后一天。如果一个月中的某天大于30,则减去1(因为无论如何它都不能大于31)。
$begin_date = '2019-12-30';
$date = new DateTime($begin_date);
for ($i = 1; $i <= 5; $i++) {
echo '<p>'.$date->format("Y-m-d")."</p>\n";
$date->modify("last day of next month");
if ($date->format("d") > 30) {
$date->modify("-1 day");
}
}
如果您正在寻找一种更动态的方法(如果日期不一定总是30号),则可以复制原始对象,并从该月的原始日期中减去该月的当前日期。
$begin_date = '2019-12-30';
$date = new DateTime($begin_date);
$original_date = clone $date;
for ($i = 1; $i <= 5; $i++) {
echo '<p>'.$date->format("Y-m-d")."</p>\n";
$date->modify("last day of next month");
if ($date->format("d") > $original_date->format("d")) {
$date->modify("-".($date->format("d") - $original_date->format("d"))." day");
}
}