PHP Carbon DateTime добавляет два месяца и полностью пропускает ноябрь

Мне нужно отображать три календаря один на текущий месяц, а два других – на следующие два месяца.

Я использую Carbon для выполнения этих расчетов.

Сегодня 31 октября.

Если я напишу следующее

$carbon = Carbon::now('UTC'); // current datetime in UTC is 8:54 AM October 31, 2016 echo $carbon->format('F') . '<br>'; echo $carbon->addMonths(1)->format('F'); 

Я получаю этот вывод

октября

Декабрь

Я полностью упускаю ноябрь … так как я могу добавить месяц на октябрь, чтобы получить ноябрь.

По умолчанию addMonths(1) добавляет ровно 30 дней в месяц.

Чтобы добавить ровно один месяц (например, для перехода с октября по ноябрь, независимо от того, будет ли это 29/30/31 дней), вам нужно покончить с addMonth() и вместо этого использовать addMonthsNoOverflow(n) .

Так, например:

 $carbon = Carbon::now('UTC'); // current datetime in UTC is 8:54 AM October 31, 2016 echo $carbon->format('F') . '<br>'; echo $carbon->addMonths(1)->format('F'); 

неожиданно Выходы:

Октябрь декабрь

В то время как

 $carbon = Carbon::now('UTC'); // current datetime in UTC is 8:54 AM October 31, 2016 echo $carbon->format('F') . '<br>'; echo $carbon->addMonthsNoOverflow(1)->format('F'); 

Правильно выдает:

октябрь ноябрь

Это не связано с Carbon, но из-за класса datetime PHP, на котором он построен.

Причина addMonthsNoOverflow() НЕ является поведением по умолчанию, потому что это было бы «нарушением изменения». К сожалению, это НЕ упоминается в документации, так что -1 указывает на углерод для этого.

Вы можете больше узнать об этом в этом разговоре Github: https://github.com/briannesbitt/Carbon/issues/627