Recorrer un rango de fechas en php

Índice
  1. Introducción
  2. Convertir fecha a timestamp
  3. Como recorrer un rango de fechas

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: 4 Promedio: 5)
  1. César Peralta Alvarado dice:

    Una solución muy útil.

  2. Antonio dice:

    Hola a ver si me podéis ayudar. Me gustaría hacer un recorrido por unas fechas y extraer que día de la semana es cada uno.
    Tengo una fecha de entrada y una fecha de salida, ya se como sacar los días que hay entre uno y otro. Ahora me gustaría saber que día de la semana es cada uno.

    $fechaEntrada = new DateTime($_POST["fecha-entrada"]);
    $fechaSalida = new DateTime($_POST["fecha-salida"]);
    $diff = $fechaEntrada->diff($fechaSalida);
    $dias = $diff->days;

    Este es mi código, que me devuelve en la variable $dias, la diferencia de días, ahora me gustaría saber que días son. Lunes, Martes......

    Gracias

    1. Nacho dice:

      Hola Antonio, quizás este código pueda servirte:

      $intervalo = DateInterval::createFromDateString('1 day');
      $periodo = new DatePeriod($fechaEntrada, $intervalo, $fechaSalida);

      foreach ($periodo as $dt) {
      echo $dt->format("d-m-Y es N\n");
      }

  3. mario Ruiz dice:

    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. Nacho dice:

      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.

    2. OZKR dice:

      OK para cambio de horario resta el día siguiente al día actual con strtotime() para tener siempre cuanto vale un día, de esta manera si cae el horario de verano entonces podrás tener el resultado correcto si un dia llegase a durar 23 hrs o 25 hrs en el inicio y fin del horario de verano. Bueno así lo resolví yo 😀

      $tiempoInicio = strtotime($fechaInicio);
      $tiempoFin = strtotime($fechaFin);

      $dia = 86400;
      while($tiempoInicio <= $tiempoFin){

      $fechaActual = date("Y-m-d", $tiempoInicio);
      $dia2 = strtotime($fechaActual. "+ 1 days");
      $dia1 = strtotime($fechaActual);
      $dia = $dia2 - $dia1 ;

      # Sumar el incremento para que en algún momento termine el ciclo
      $tiempoInicio += $dia;

  4. Steve dice:

    1/11/2019 0:00
    Nacho mira este es el formato en el que tengo las fechas en excel y tengo asignado mi variable Fecha_inicio como un campo varchar
    en mi base de datos.

    1. Nacho dice:

      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()

  5. Steve dice:

    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. Nacho dice:

      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.

  6. juanda dice:

    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á?

  7. elbarto dice:

    $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.

  8. etv dice:

    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. admin dice:

      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.

  9. Luki dice:

    Como puedo implementar un buscador por fechas y por palabras, pero que busque en la misma lista que me encuentro y que no me busque en general.

    1. admin dice:

      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. Luki dice:

        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. Luki dice:

          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. admin dice:

            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. Luki dice:

        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. admin dice:

          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.

  10. arley dice:

    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

  11. felix dice:

    esta de lujo me quitaste el dolor de cabeza... en verdad GRACIAS.....

  12. Isaac Rosario dice:

    Cómo puedo hacer para recorrer varios rangos al mismo tiempo?

    Osea voy a extraerlos de una dB, pero las fecha van a estar saltando.

    1. issux dice:

      Pues tendrás que echar un vistazo a la documentación de hilos en php (http://php.net/manual/es/class.thread.php) para ir generando un hilo por cada consulta.

  13. Felipe Morales dice:

    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)) . "";

    }

    ?>

    1. issux dice:

      Hola Felipe,

      no se exactamente a que te refieres. ¿Hay algún problema en el código del post?

  14. Ronny dice:

    Excelente post, sencillo pero muy util, muchas gracias!

  15. Andres dice:

    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

  16. Jumi dice:

    Wao impresionante, me funciono muy bien, felicidades! Listo para implementarlo

  17. Andrés dice:

    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. issux dice:

      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.

    2. luis dice:

      hola disculpa si pudiste resolver ese problema??

  18. Isaac Rosario Duran dice:

    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.

    1. issux dice:

      Echale un vistazo a este posts de StackOverflow (http://stackoverflow.com/questions/1791895/converting-date-and-time-to-unix-timestamp) para convertir fechas a formato unix timestamp.

Deja una respuesta

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

Subir