Что может пойти не так, если добавить месяцы с DateInterval и DateTime :: add?

Мне не удалось найти правильное решение этой проблемы. Как вы видите в примере №3 в документации PHP, они заявляют, что нужно быть осторожным при добавлении месяцев с использованием DateInterval в DateTime :: add.

На самом деле нет никакого объяснения, почему поведение метода как таковое и что я могу сделать, чтобы этого избежать, что на первый взгляд я считаю ошибкой.

У кого-нибудь есть понимание этого?

Проблема в том, что каждый месяц может иметь различное количество дней в них. Вопрос заключается в том, что вы делаете, когда хотите увеличить дату на 1 месяц. По документации PHP, если вы 31 января (или 30), и вы добавляете 1 месяц, каково ожидаемое поведение?

В феврале только 29 дней. Вы хотите установить последний день месяца? Вы, как правило, более безопасно увеличиваетесь на определенное количество дней, если это то, что вы ищете, или статическую дату, основанную на текущей дате. Не зная, чего вы пытаетесь достичь, когда вы увеличиваете свой месяц, трудно сказать, как следить за ошибкой.

РЕДАКТИРОВАТЬ:
Поскольку кто-то упоминает в подобном сообщении, прокомментированном Майком Б выше, вы, вероятно, захотите сделать что-то, где вы (в псевдокоде):

1) Use cal_days_in_month() for the next month and save that number to a variable x 2) If x >= current billing DOB, increment and be done 3) DateTime::modify('last day') (havent used this before but something along these lines) to set the date to the last date of the next month (set it to the 1st of the next month, then last day?) 

Стоит отметить, что если вы используете переменную здесь как новое платежное значение, вы уничтожите свое исходное значение. Я бы сохранил дополнительное значение DB, которое является «первой датой выставления счета» или просто «billing_day_of_month» или что-то еще, и используйте это, чтобы выяснить день месяца, который вы должны смотреть на

Если ваша цель – строго увеличить удобные месяцы (таким образом, 3 месяца с 21 января должны быть 21 апреля), за исключением того, что сокращаются сроки членства в месяцах (таким образом, 1 месяц с 31 января – 28 февраля / 29) то вам нужно вернуться всего несколько дней, если вы перейдете в следующий месяц:

 function addMonths($date,$months) { $orig_day = $date->format("d"); $date->modify("+".$months." months"); while ($date->format("d")<$orig_day && $date->format("d")<5) $date->modify("-1 day"); } $d = new DateTime("2000-01-31"); addMonths($d,1); echo $d->format("Ymd"); // 2000-02-29