PHP: Прокрутите все месяцы в диапазоне дат?

Если у меня есть дата начала (скажем 2009-02-01 ) и дата окончания (скажем, 2010-01-01 ), как я могу создать цикл для прохождения всех дат (месяцев) в диапазоне?

Related of "PHP: Прокрутите все месяцы в диапазоне дат?"

Пытаться

 $start = $month = strtotime('2009-02-01'); $end = strtotime('2011-01-01'); while($month < $end) { echo date('F Y', $month), PHP_EOL; $month = strtotime("+1 month", $month); } 

Обратите внимание на примечание http://php.net/manual/de/datetime.formats.relative.php

Относительные значения месяца рассчитываются исходя из продолжительности месяцев, через которые они проходят. Примером может служить «+2 месяц 2011-11-30», который будет производить «2012-01-30». Это связано с тем, что ноябрь составляет 30 дней, а декабрь составляет 31 день в длину, что составляет 61 день.

Начиная с PHP5.3 вы можете использовать http://www.php.net/manual/en/class.dateperiod.php

Пример комбинации классов DateTime , DateInterval и DatePeriod :

 $start = new DateTime('2009-02-01'); $interval = new DateInterval('P1M'); $end = new DateTime('2011-01-01'); $period = new DatePeriod($start, $interval, $end); foreach ($period as $dt) { echo $dt->format('F Y') . PHP_EOL; } 

Принятый ответ неправильный.

Я пробовал этот сниппет, и он работает неправильно. Если ваша дата начала – конец месяца, а дата окончания – начало третьего месяца.

Например: 2014-08-31 – 2014-10-01

Ожидаемое должно быть.

  • августейший
  • сентябрь
  • октября

Лучшее решение:

 $start = new DateTime('2010-12-02'); $start->modify('first day of this month'); $end = new DateTime('2012-05-06'); $end->modify('first day of next month'); $interval = DateInterval::createFromDateString('1 month'); $period = new DatePeriod($start, $interval, $end); foreach ($period as $dt) { echo $dt->format("Ym") . "<br>\n"; } 

Ссылка: как перечислить все месяцы между двумя датами

 $start = strtotime('2011-09-01'); $end = strtotime('2013-12-01'); while($start < $end) { echo date('F Y', $start) . '<br>'; $start = strtotime("+1 month", $start); } 

У меня есть метод, который оптимален в результатах:

 $begin = new DateTime( '2014-07-14' ); $end = new DateTime( '2014-08-01' ); $end = $end->modify( '+1 month' ); $interval = DateInterval::createFromDateString('1 month'); $period = new DatePeriod($begin, $interval, $end); foreach($period as $dt) { var_dump($dt->format( "m" )); } 

Плюс к методу @Glavic

Мне нравится простота принятого ответа, но как 3s2ng, это не всегда работает. Так что я сделал это следующим образом:

  $start = strtotime('2009-02-01'); $startmoyr = date('Y', $start) . date('m', $start); $end = strtotime('2013-12-01'); $endmoyr = date('Y', $end) . date('m', $end); while ($startmoyr <= $endmoyr) { echo date("FY", $start) . "<br>"; $start = strtotime("+1month", $start); $startmoyr = date('Y', $start) . date('m', $start); }