2010-01-28 137 views

Respuesta

70

Trate

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

mente la nota http://php.net/manual/de/datetime.formats.relative.php

Los valores relativos mes se calculan en función de la duración de meses que pasan a través. Un ejemplo sería "+2 mes 2011-11-30", que produciría "2012-01-30". Esto se debe a que noviembre tiene 30 días de duración y diciembre tiene 31 días de duración, lo que arroja un total de 61 días.

Como de PHP5.3 puede utilizar combinación http://www.php.net/manual/en/class.dateperiod.php

+0

He intentado este fragmento y no funciona correctamente. Si su fecha de inicio es el final del mes y la fecha de finalización es el comienzo del tercer mes. Por ejemplo: 2014-08-31 - 2014-10-01 – 3s2ng

+2

@ 3s2ng sí, pero este es el comportamiento esperado para los formatos de tiempo relativo. Ver la actualización de mi respuesta. – Gordon

+0

yap que lo haría. Gracias. – 3s2ng

26

Ejemplo de DateTime, DateInterval y DatePeriod clase:

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

I tener un método que es óptima en los 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")); 
} 

Una ventaja para el método de @Glavic

15

La respuesta aceptada no es la correcta.

He intentado este fragmento y no funciona correctamente. Si su fecha de inicio es el final del mes y la fecha de finalización es el comienzo del tercer mes.

Por ejemplo: 08/31/2014 - 2014-10-01

esperado debería ser.

  • agosto
  • septiembre
  • octubre

La mejor solución es:

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

Referencia: How to list all months between two dates

1

me gusta la simplicidad de la respuesta aceptada, pero como 3s2ng, no siempre funciona. Así que lo escribí de la siguiente manera:

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