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 recorrer todas las fechas (meses) en el rango?PHP: Bucle a través de todos los meses en un rango de fechas?
Respuesta
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
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;
}
$start = strtotime('2011-09-01');
$end = strtotime('2013-12-01');
while($start < $end)
{
echo date('F Y', $start) . '<br>';
$start = strtotime("+1 month", $start);
}
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
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
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);
}
- 1. Grupo por rango de fechas en semanas/meses de intervalo
- 2. Obtener todos los archivos modificados dentro de un rango de fechas
- 3. php bucle a través de múltiples matrices
- 4. Rails cómo crear una serie de meses basado en un rango de fechas
- 5. función php para obtener todos los lunes dentro del rango de fechas
- 6. Enumere los meses entre dos fechas
- 7. Crear un rango de fechas
- 8. bucle a través de un NSMutableDictionary
- 9. Los rieles calculan el intervalo de fechas en meses
- 10. ¿Cómo bucleo a través de un rango de fechas en reversa?
- 11. bucle a través de los valores enum
- 12. Loop a través de fechas, excepto los fines de semana
- 13. php: bucle a través matriz JSON
- 14. oráculo rango de fechas
- 15. selector de rango de fechas similar al selector de rango de fechas de Google Analytics?
- 16. bucle a través de un directorio de
- 17. Número de meses entre dos fechas
- 18. ¿Cómo determinar si un rango de fechas ocurre en cualquier momento dentro de otro rango de fechas?
- 19. bucle a través de todos los elementos td en una tabla
- 20. Bucle a través de todos los archivos en el directorio Palabra
- 21. Shellscript bucle a través de todos los archivos en una carpeta
- 22. t-sql select get all Meses dentro de un rango de años
- 23. Bucle y búsqueda a través de TODOS los elementos en localStorage
- 24. PHP MySQL Obtener nombres de columna Mientras iteración a través de todos los registros
- 25. Grep dentro de todos los archivos creados dentro del rango de fechas
- 26. bucle a través de subcarpetas
- 27. SQL Rango de fechas dividido
- 28. Consultar el rango de fechas en los raíles
- 29. vba Bucle en un rango no contiguo
- 30. jQuery Validate (Rango de fechas)
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
@ 3s2ng sí, pero este es el comportamiento esperado para los formatos de tiempo relativo. Ver la actualización de mi respuesta. – Gordon
yap que lo haría. Gracias. – 3s2ng