Дата PHP неверно указана месяц при вычитании одного месяца

Текущая дата – 29 марта 2017 года

Когда я вычитаю 2 месяца с помощью PHP, и я получаю January

 $prevmonth = date('M', strtotime('-2 months')); echo $prevmonth; 

Но когда я вычитаю 1 месяц, это дает March

 $prevmonth = date('M', strtotime('-1 months')); echo $prevmonth; 

strtotime() использует 30-дневные месяцы, а в феврале (только в этом году) всего 28 дней, поэтому в феврале не будет дана действительная дата. Вы можете использовать текущий день d или j и вычесть то, что всегда будет помещено в предыдущий месяц ( -29 days ):

 $prevmonth = date('M', strtotime('-' . date('d') . ' days')); 

Это будет December с January .

Как указано в комментариях, нет 29 февраля.

29 февраля становится 1 марта.

Возможно, вам лучше получить текущий номер месяца, -1 из него, а затем получить текстовое представление.

 $prevMonth = date('n') - 1; $prevMonthText = date('M', mktime(0, 0, 0, $prevMonth, 10)); 

Или, вы можете использовать DateTime если ваша версия PHP позволяет (она должна).

 $prevMonth = date('n') - 1; $dateObj = DateTime::createFromFormat('!m', $prevMonth); $monthName = $dateObj->format('M'); // March 

Единственная проблема с этим, что вы, возможно, заметили, – январь никогда не вернется в декабре. Быстрое тернарное заявление поймает это.

 $prevMonth = ((date('n') - 1) < 1) ? 12 : date('n') - 1;