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