2016-10-31 7 views
2

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

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

октября

декабря

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

+1

попробовать 'addMonths (2)', что вернется? –

+1

Не совсем уверен, но если вы уберете 1 день, а затем добавьте один месяц, что вы получите? – Epodax

+0

@Epodax, приятно пойманный ... он показывает ноябрь, значит, это значит, что что-то не так с расчетами Carbons? –

ответ

2

По умолчанию 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'); 

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

Октябрь Ноябрь

Такое поведение не связано с атомом углерода, но из-за класса PHP даты и времени, что он построен на.

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

Вы можете прочитать об этом в этом Github разговор: https://github.com/briannesbitt/Carbon/issues/627