Мне нужно отображать три календаря один на текущий месяц, а два других – на следующие два месяца.
Я использую 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