PHP: Loop durante todos os meses em um intervalo de datas?

Se eu tiver uma data de início (digamos 2009-02-01 ) e uma data final (digamos 2010-01-01 ), como posso criar um loop para passar por todas as datas (meses) no intervalo?

Experimentar

 $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); } 

Lembre-se da nota http://php.net/manual/de/datetime.formats.relative.php

Os valores dos meses relativos são calculados com base no período de meses que eles passam. Um exemplo seria "+2 meses 2011-11-30", o que produziria "2012-01-30". Isto é devido a novembro com 30 dias de duração, e dezembro com 31 dias de duração, produzindo um total de 61 dias.

A partir de PHP5.3 você pode usar http://www.php.net/manual/en/class.dateperiod.php

Exemplo de combinação de class DateTime , DateInterval e 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; } 

A resposta aceita não é a maneira correta.

Eu tentei esse trecho e não funciona corretamente. Se a sua data de início é o final do mês e a data de término é o início do 3º mês.

Por exemplo: 2014-08-31 – 2014-10-01

Esperado deve ser.

  • agosto
  • setembro
  • Outubro

A melhor solução é:

 $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") . "
\n"; }

Referência: Como listar todos os meses entre duas datas

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

Eu tenho um método ideal nos resultados:

 $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" )); } 

Uma vantagem para o método de @Glavic

Eu gosto da simplicidade da resposta aceita, mas como 3s2ng, nem sempre funciona. Então eu fiquei assim:

  $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) . "
"; $start = strtotime("+1month", $start); $startmoyr = date('Y', $start) . date('m', $start); }