Recorrer un rango de fechas en php

Introducción

Recientemente para un proyecto, necesitaba recorrer un rango de fechas en php, para realizar una serie de comprobaciones cada día de ese rango.

Investigando a ver cómo se podía hacer de manera sencilla, encontré un método que puede resultarnos muy útil.

Como comentaba en un post para calcular dias entre dos fechas, lo primordial es realizar la conversion a timestamp.

Convertir fecha a timestamp

Lo primero es convertir la fecha a formato timestamp con la función strtotime:

echo strtotime("dd-mm-aaaa");

en la que debemos sustituir “dd-mm-aaaa” por la fecha a convertir.

Si queremos obtener el timestamp de ahora mismo, es tan simple como hacer

echo strtotime("now");

Como recorrer un rango de fechas

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 número de segundos de un día), de esta manera avanzamos día a día.

Por ejemplo, si queremos recorrer el rango de fechas del 25 de febrero de 2008 al 1 de abril de 2008, lo haríamos asi:

<?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 días por mes, etc. ¿Conocéis alguna otra manera de recorrer un rango de fechas que sea sencilla?. Si es así, dejar un mensaje, y así nos beneficiamos todos… ;D

¡Haz clic para puntuar esta entrada!
(Votos: 1 Promedio: 5)

66 pensamientos sobre “Recorrer un rango de fechas en php”

  1. que podemos hacer con el cambio de horario????
    mira mi codigo:
    for($i=$fechaprimero;$i<=$fechaultimo;$i+=86400){
    echo $i . " " . date("Y-d-m H:i:s",$i)." +++++ «;
    }

    $fechaprimero es el 1 de noviembre de 2019
    $fechaultimo es el 30 de noviembre de 2019

    el resultado es asi: (checa el 03 nov)

    1572584400 2019-01-11 00:00:00 +++++
    1572670800 2019-02-11 00:00:00 +++++
    1572757200 2019-03-11 00:00:00 +++++
    1572843600 2019-03-11 23:00:00 +++++
    1572930000 2019-04-11 23:00:00 +++++
    1573016400 2019-05-11 23:00:00 +++++
    1573102800 2019-06-11 23:00:00 +++++
    1573189200 2019-07-11 23:00:00 +++++
    1573275600 2019-08-11 23:00:00 +++++
    1573362000 2019-09-11 23:00:00 +++++

    y el resultado

    1. Hola Mario,

      creo que no es problema del cambio horario. No se en que país resides, pero aquí en España el cambio horario es el ultimo domingo del mes de marzo y octubre.

      Acabo de probar el código en mi equipo y lo muestra correctamente. Creo que puede ser un problema de la versión de php (yo tengo la 7.3), si puedes actualizarlo prueba a ver si así te funciona. Me parece que a algún otro usuario le pasaba y era por la versión de php.

      Saludos.

    1. Hola,

      pues entonces yo haría lo siguiente: El campo de la base de datos utilizaría un timestamp en vez de varchar. Con la función strototime, convertir la fecha del excel en un timestamp y en la consulta en el insert utilizaria la funcion FROM_UNIXTIME:
      $timestamp = strtotime($fecha_excel);
      insert into TABLA values(FROM_UNIXTIME($timestamp));

      Y a la hora de recuperar el valor, para el campo de la base de datos:

      SELECT UNIX_TIMESTAMP(CAMPO) FROM TABLA

      Y luego en php ya haces las conversiones necesarias con la funcion date()

  2. Tengo una pregunta,
    lo que pasa es que estoy insertando las fechas que contiene un excel en mi base de datos pero al momento de subirlas me las subia como numero ejemplo 5643134 asi no mas, le inserte este codigo -> $Fecha_inicio = date("d/m/Y", (int)$numRows["topic_last_post_time "]);
    pero lo que hace es insertarme la fecha 01/01/1970
    en todos los campos que puedo hacer? gracias.

    1. Hola,
      ¿en que formato tienes el campo $numRows["topic_last_post_time"]?¿Es una fecha en formato timestamp o en formato dia/mes/año?. Si es un timestamp con hacer $Fecha_inicio = date("d/m/Y",$numRows["topic_last_post_time "]) debería funcionar.

  3. Hola compadres tengo un problema similar pero la verdad nada de lo que e intentado funciona, Necesito un contador de días de fecha actual, me explico que comiense hoy y solo muestre 1 2 3 4 5 6 7 ps solo el numero de días que hayan trascurrido y que solo se reinicie a 1 si le doy reset con un boton, se podrá?

  4. $fechaInicio1=strtotime($_REQUEST["fechaInicio"]);
    $fechaFin1=strtotime(sumasdiasemana("$fecha1",$dias_practica));
    for($i=$fechaInicio1; $i<=$fechaFin1; $i+=86400){
    $fin = date("d-m-Y", $i)."<br>";

    if ($fin == date("01-01-2020")) {
    $cont = $cont + 1;
    echo "$cont";
    }
    }

    alguien que me ayude quiero, quiero que mi contador aumente cada vez que pasa por cierta fecha, pero no me da resultado no me incrementa el contador.

  5. Alguien sabe porque las fechas se repiten despues del rango ? es decir si el rango de fecha inicia del 10 al 15 al terminar de imprimir esas fechas las vuelve a repetir

    1. Es raro el problema que comentas. ¿El rango de fechas que comenta incluye el dia de cambio de verano?. ¿Has probado con otras versiones de php?. Creo recordar que con alguna version vieja 5.x hacia cosas un poco raras.

    1. Hola Luki,

      el implementar un buscador y que funcione correctamente como dices (buscando por fechas y palabras no es sencillo). No se realmente si lo buscas en php o en otro lenguaje y si usas un cms o no, ya que dependiendo de ambas cosas, cambiaria.

      Si usas un cms tipo wordpress o similar, te recomendaria que buscases algun plugin. Hay plugins que amplian el buscador por defecto, e incluso realizan la busqueda por campos personalizados.

      Siento no poder ayudarte mas, pero con tan poco datos es dificil.

      Saludos.

      1. Te cuento que lo estoy haciendo con puro PHP, lo malo es que cuando ejecuto la busqueda lo hace en general y no con la lista que sale al momento de ingresar a los clientes

        1. digamos que como usuario yo agregue a 10 clientes y cuando ingrese a mi lista de clientes pueda buscar en especifico a esos 10 clientes, hasta ahí lo tengo echo pero resulta que cuando hago buscar lo hace en general y busca los clientes de los demás usuarios, mi código de la lista esta programado con PHP y para la base de datos wampServe – phpmyadmin

          1. Hola Luki,
            tal y como lo he entendido, lo que haria es en el codigo del buscador comprobar si hay un usuario logueado (si esta logueado, tendras su id guardada en sesion). Entonces, modificar la consulta del buscador para que limite la busqueda de cliente solo a los asociados a ese usuario logueado. Algo asi:

            $consulta = mysql_query(‘SELECT * FROM clients WHERE user_owner = ‘.$_SESSION[‘user_id’]);

            En la tabla de clientes tendras un campo asociado indicando que usuario de los que hacen login lo ha dado de alta (user_owner) y user_id es la variable de sesion que guarda el id del usuario que ha hecho login.

            Modificando la consulta del buscador, te deberia funcionar.

      2. your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘0, 50’ at line 2
        ahora me sale ese error

        $query = mysqli_query($conection,»SELECT * FROM cliente WHERE
        ( user_owner = ‘».$_SESSION[‘idUser’].»‘ $desde, $por_pagina») or die(mysqli_error($conection));

        1. Hola Luki,

          creo que el error que te da es por que le falta el limit(te lo marco en negrita) en la consulta:
          $query = mysqli_query($conection,»SELECT * FROM cliente WHERE
          ( user_owner = ‘».$_SESSION[‘idUser’].»‘ LIMIT $desde, $por_pagina») or die(mysqli_error($conection));

          Saludos.

  6. yo ocupo.. que al momento de presionar un botón que diga 4 meses.. todas las personas que se registraron hace 4 meses aparezcan.. tendría que comparar la fecha actual y en automático la de hace 4 meses.. osea que se agrupen los registros… Como lo hago???? en PHP

  7. Tengo algo similar pero no tiene el problema del día final

    <?php

    $fechaInicio = "2014-02-01";

    $fechaFin = "2014-03-31";

    for($i=$fechaInicio; $i<=$fechaFin; $i = date("Y-m-d", strtotime($i ."+ 1 days"))){

    echo date("d-m-Y", strtotime($i)) . "»;

    }

    ?>

  8. Hola issux gracias por responder, fíjate he cambiado los tipos de datos he hecho de todo pero no me funciona, no tengo mucha experiencia con el manejo de fechas y menos desde datepicker, necesito un poco más de ayuda a nivel de código. Gracias de antemano

  9. Hola Issux estoy haciendo un sistema de reservas y quiero comparar dos rangos de fechas, una fecha_inicio y una fecha_fin para que cuando un rango de fechas reservadas le indique al cliente que ya están reservadas, ejemplo: si ya hay una reserva hecha desde el 12/06/2013 al 25/06/2013 que en ese rango de fechas no pueda reservar y el sistema le indique que están ocupadas he intendado de varias maneras y no he podido:

    acá te dejo algo de lo que hecho a ver en que puedes ayudarme, gracias de antemano.

    $sql=(«SELECT * FROM reservacion_departamento WHERE fecha_inicio, fecha_fin BETWEEN ‘dd/mm/aa’ AND ‘dd/mm/aa’;»);
    $consulta=mysql_query($sql,$conexion);
    while($resultado=mysql_fetch_array($consulta)){
    if (($fecha_inicio) <= ($resultado[&#039fecha_inicio&#039]))
    $flag = 1;
    else
    $flag = 0;
    }
    if ($flag == 1){
    echo ("
    alert (‘fecha no disponible…’)
    «);
    }
    else
    {
    echo (»
    alert (‘Fechas disponibles, reserve ahora…’)
    location.href = ‘reserva_departamento.php’;
    «);
    }
    }//Fin consultar

    1. Hola Andrés,

      El problema tiene toda la pinta de ser por el tipo de dato de la bd, que supongo que debe ser un date y las comparaciones que se hacen. Cambiaría el tipo de dato de la tabla por un timestamp, y de esta manera las comparaciones no me darían problemas. Puedes utilizar el método strtotime() para convertir a timestamp la fecha, y revisa la pagina http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html para las funciones de conversión de fechas de mysql.

      Saludos.

  10. Isaac Rosario Duran

    Alguien sabe como hacer eso mismo en Javascript. Estoy implementando un calendario de disponibilidad, el cual paso las fechas a un script de JS y el formato de fecha es el siguiente [‘2017-03-02’] osea Y-m-d pero cuando le paso estos datos el calendario solo me muestra la ultima fecha en rojo, y omite las demas.

    pero si hago un echo con php me sale lo que quiero, pero no he podido combinarlos con JS.
    Alguien puede ayudarme por favor, mis conocimientos de JS son muy muy básicos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *