Recorrer un rango de fechas en php

18

codigo php Recorrer un rango de fechas en php
Recientemente para un proyecto, necesitaba recorrer un rango de fechas, para realizar una serie de comprobaciones cada día de ese rango. Investigando a ver como se podía hacer de manera sencilla, encontré un método que puede resultarnos muy útil.

Se trata de utilizar un bucle for de toda la vida, pero haciendo una conversión de las fechas a timestamp. Además, incrementaremos la variable en 86400 (el numero de segundos de un dia), de esta manera avanzamos día a día.

< ?php
$fechaInicio=strtotime("25-02-2008");
$fechaFin=strtotime"01-04-2008");

for($i=$fechaInicio; $i<=$fechaFin; $i+=86400){
    echo date("d-m-Y", $i)."<br>";
}
?>

Con este método nos evitamos las comprobaciones por si es año bisiesto, numero de dias por mes, etc.

¿Conoceis alguna otra manera de recorrer un rango de fechas que sea sencilla?. Si es asi, dejar un mensaje, y así nos beneficiamos todos… ;D

Contenidos Relacionados

18 Respuestas a “Recorrer un rango de fechas en php”

  1. sony dice:

    muy buen aporte issux

  2. Ricardo G dice:

    muy bueno, para fechas de no mas de un año, pero imagina si el rango de fecha es de 10 años son 365×10 uff ! un ciclo muy largo, y eso es cuando esas usando fechas guardadas en archivos, lo mejor seria directamente desde la base de datos, no crees ??

    saludos.

  3. Ricardo G dice:

    estimado, lo probe y no se demora mucho, menos de un segundo, en mi equipo, no lo he probado en un servidor.

    saludos !

  4. issux dice:

    @ Ricardo G:

    La verdad es que ni había contemplado el uso de ficheros para guardar las fechas, me parece una solución poco eficiente. Como comentas, es mucho mejor guardarlas en la bd, nos permite mas flexibilidad.

    Y sobre recorrer fechas, el ejemplo esta pensado para un sistema de gestión de reservas, donde cada una tiene una fecha de inicio y otra de fin, pero evidentemente no duran años.

    Para casos como el tuyo donde el rango de fechas es de años, lo mejor es sacar la posición de las funciones strtotime fuera del bucle, ya que nos ahorramos una cantidad considerable de llamadas a dicha función, con lo que conseguimos mas rápidas y menos carga en el servidor.

    Por ejemplo, jugando un poco con el ab (100 consultas, con una concurrencia de 5 usuarios simultáneos) de apache vemos que:

    Ejemplo con strtotime dentro del for:
    Time taken for tests: 4.385 seconds
    Requests per second: 22.81 [#/sec] (mean)

    Ejemplo con strtotime fuera del bucle:

    Time taken for tests: 1.707 seconds
    Requests per second: 58.57 [#/sec] (mean)

    Las ventajas con el segundo método son evidentes.

    Gracias por el comentario, y saludos.

  5. yasmany dice:

    Hola soy nuevo y estaba buscando algo asi como el metod del rango de dos fechas.
    Lei tu metodo pero cuando capturo la fecha me devuelve los dias desde 1970 hasta la fecha final.en la parte de
    $fechaInicio=strtotime(“25-02-2008″);
    $fechaFin=strtotime”01-04-2008″);
    ahi yo pongo
    $fechaInicio=strtotime($_post['fecha']);
    $fechaFin=strtotime($_post['fechaf']);
    por favor decirme si como lo estoy poniendo esta mal.
    muchas gracias

  6. issux dice:

    Buenas.

    Si no he entendido mal, quieres saber el numero de dias entre dos fechas. Si es asi, es sencillo, prueba lo siguiente:

    $fechaInicio=strtotime($_post['fecha']);
    $fechaFin=strtotime($_post['fechaf']);
    $dias= (($fechaFin-$fechaInicio)/86400);

    Con esto sabras el numero de dias entre dos fechas.

    Saludos.

  7. nick dice:

    cuando ejecuto
    $fechaInicio=strtotime(“01-10-2009″);
    $fechaFin=strtotime(“23-12-2009″);

    con esas fechas me repite la fecha:
    11/01/2009
    11/01/2009

    aparte no me muestra : 23-12-2009 que esta dentro del rango sin embargo si la muestra . Seria genial que no tiviera datalles, tambien me paso lo que a yasmany lo que le muestra desde la fecha 1970, me paso 2 veces extrañamanete estoy tratanto de replicar la falla

  8. LUIS PUMARICRA DIAZ dice:

    Hola gracias por tu codigo, este es mi caso:

    $fechaInicio = strtotime(“01-03-2011″);
    $fechaFin = strtotime(“31-03-2011″);

    for($i=$fechaInicio; $i<=$fechaFin; $i+=86400){
    echo date("d-m-Y", $i)."”;
    }

    —-

    si ejecuto eso, se genera el bucle y me sale:
    01-03-2011 hasta el 30-03-2011

    pero MARZO del 2011 no tiene 31 DIAS…?

    please ayudame… que debo de cambiar o agregar en el codigo..?

  9. issux dice:

    Buenas.

    Es curioso, con php 5.3.3 no muestra ningun tipo de fecha repetida, muestra las fechas correctamente. Quizas sea algun bug de la version de php que estes utilizando (o quizas de la version y del ssoo).

    Saludos.

  10. issux dice:

    Buenas Luis.

    Es curioso, hay un desfase de 1/2h y por eso no muestra el dia 31. ¿Quizas sea por la combinacion de la zona horaria junto con el horario de verano?.

    En fin, para evitar eso, cambia la linea por
    $fechaFin = strtotime("31-03-2011 + 1 days");

    Con esto se arreglaria.

    Saludos.

  11. yopi dice:

    hola soy nueva en todo esto mi problema es q necesito mostrar registros de la bd comprendidos en un rango de fechas, por ejemplo el usuario selecciona un periodo y debe obtener todos los registros comprendidos en ese periodo ordenados por fecha y en las q no hubo registros mostrarlo en blanco pero no tengo idea de como hacer esto espero me puedan ayudar. gracias

  12. Mario dice:

    Muy buen código, me estaba rompiendo la cabeza pensando en comparaciones extensas para rangos de fechas.. gracias por el aporte

  13. marielaf dice:

    el codigo es muy bueno pero quiero hacer una consulta como hago para listar solo los meses y los años dentro del rango

  14. INHack20 dice:

    Hermanooo justo lo que estaba buscando, funciona a la perfeccion, con el pude hacer otras cosas! Muchas Gracias!!

  15. issux dice:

    Marielaf,

    Cambia la linea:

    echo date(“d-m-Y”, $i).”<br />”;

    por

    echo date(“m-Y”, $i).”<br />”;

    Saludos.

  16. issux dice:

    Gracias, INHack20. ;D

  17. Lo he utilizado y funciona bien, rapido y sencillo como tiene que ser…gracias buen trabajo !!

  18. Paco dice:

    Buen trabajo!! Muchas gracias!!!!

Responder