
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
muy buen aporte issux
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.
estimado, lo probe y no se demora mucho, menos de un segundo, en mi equipo, no lo he probado en un servidor.
saludos !
@ 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 secondsRequests per second: 22.81 [#/sec] (mean)
Ejemplo con strtotime fuera del bucle:
Time taken for tests: 1.707 secondsRequests per second: 58.57 [#/sec] (mean)
Las ventajas con el segundo método son evidentes.
Gracias por el comentario, y saludos.
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
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.
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