obtener - rango de fechas php
PHP: Bucle a través de todos los meses en un rango de fechas? (6)
Si tengo una fecha de inicio (digamos, 2009-02-01
) y una fecha de finalización (digamos, 2010-01-01
), ¿cómo puedo crear un ciclo para pasar por todas las fechas (meses) en el rango?
Ejemplo de combinación de clases DateTime , DateInterval y http://www.php.net/manual/en/class.dateperiod.php :
$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;
}
La respuesta aceptada no es la correcta.
Intenté 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
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: cómo enumerar todos los meses entre dos fechas
Me gusta la simplicidad de la respuesta aceptada, pero como 3s2ng, no siempre funciona. Así que lo cambié así:
$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);
}
Tengo un método que es óptimo 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
Tratar
$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);
}
Tenga en cuenta la nota http://php.net/manual/de/datetime.formats.relative.php
Los valores relativos de mes se calculan en función de la duración de los meses que pasan. 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.
A partir de PHP5.3 puede usar http://www.php.net/manual/en/class.dateperiod.php
$start = strtotime(''2011-09-01'');
$end = strtotime(''2013-12-01'');
while($start < $end)
{
echo date(''F Y'', $start) . ''<br>'';
$start = strtotime("+1 month", $start);
}