Hoy en la mañana estuve platicando con un compañero sobre un algoritmo para hacer un ciclo while con PHP que fuera desde una fecha hasta otra, día a día. Por ejemplo, un ciclo que fuera desde el 18 de marzo hasta el 25 de marzo y en cada iteración se pudiera obtener el día.
Gracias a las funciones de strtotime
y date
fue una tarea fácil, y hoy vengo a explicar cómo es por si a alguien más le sirve.
Primero debemos tener el tiempo en segundos de la fecha. Por ejemplo, la fecha del 18 de enero del 2019 representada como los segundos que han pasado desde la fecha Unix es de 1552867200
segundos.
Para convertir una fecha en forma de cadena a su representación como segundos usamos strtotime
que devuelve los segundos y recibe una cadena que es una fecha.
En este caso queremos que el “step” del ciclo sea de un día. Un día representado como segundos equivale a 86400 (24
horas * 60
minutos por hora * 60
segundos por minuto), por lo tanto hay que ir aumentando este número en cada iteración.
El ciclo se terminará cuando el tiempo inicio alcance o supere al tiempo de fin, aumentando de día a día.
Hablar es de mal gusto así que veamos el código. Es un ciclo while que aumenta en un día, se rompe cuando $tiempoInicio
alcanza a $tiempoFin
.
Dentro del ciclo obtenemos la fecha legible y la formateamos con la función date.
<?php
/*
Hacer ciclos con fechas para ir desde un período
a otro, iterando día a día usando strtotime y date
@author parzibyte
*/#Definir rangos de fechas
$fechaInicio = "2019-03-18";
$fechaFin = "2019-03-25";
# Fecha como segundos
$tiempoInicio = strtotime($fechaInicio);
$tiempoFin = strtotime($fechaFin);
# 24 horas * 60 minutos por hora * 60 segundos por minuto
$dia = 86400;
while($tiempoInicio <= $tiempoFin){
# Podemos recuperar la fecha actual y formatearla
# Más información: http://php.net/manual/es/function.date.php
$fechaActual = date("Y-m-d", $tiempoInicio);
printf("Fecha dentro del ciclo: %s\n", $fechaActual);
# Sumar el incremento para que en algún momento termine el ciclo
$tiempoInicio += $dia;
}
Usamos printf como alternativa a echo, lo explico únicamente por si genera confusiones. La salida es la siguiente:
Fecha dentro del ciclo: 2019-03-18
Fecha dentro del ciclo: 2019-03-19
Fecha dentro del ciclo: 2019-03-20
Fecha dentro del ciclo: 2019-03-21
Fecha dentro del ciclo: 2019-03-22
Fecha dentro del ciclo: 2019-03-23
Fecha dentro del ciclo: 2019-03-24
Fecha dentro del ciclo: 2019-03-25
Tal vez se piense que se puede solucionar con un simple ciclo, pero no es así. Tendrías que lidiar con más cosas como saber el fin de mes, los años bisiestos (para lo del mes de febrero), los días totales de un mes, incrementar el año, etcétera.
Si cambiamos el rango a uno más largo, por ejemplo, que haya un mes de diferencia, la salida es esta:
Fecha dentro del ciclo: 2019-03-18
Fecha dentro del ciclo: 2019-03-19
Fecha dentro del ciclo: 2019-03-20
Fecha dentro del ciclo: 2019-03-21
Fecha dentro del ciclo: 2019-03-22
Fecha dentro del ciclo: 2019-03-23
Fecha dentro del ciclo: 2019-03-24
Fecha dentro del ciclo: 2019-03-25
Fecha dentro del ciclo: 2019-03-26
Fecha dentro del ciclo: 2019-03-27
Fecha dentro del ciclo: 2019-03-28
Fecha dentro del ciclo: 2019-03-29
Fecha dentro del ciclo: 2019-03-30
Fecha dentro del ciclo: 2019-03-31
Fecha dentro del ciclo: 2019-04-01
Fecha dentro del ciclo: 2019-04-02
Fecha dentro del ciclo: 2019-04-03
Fecha dentro del ciclo: 2019-04-04
Fecha dentro del ciclo: 2019-04-05
Fecha dentro del ciclo: 2019-04-06
Fecha dentro del ciclo: 2019-04-07
Fecha dentro del ciclo: 2019-04-08
Fecha dentro del ciclo: 2019-04-09
Fecha dentro del ciclo: 2019-04-10
Fecha dentro del ciclo: 2019-04-11
Fecha dentro del ciclo: 2019-04-12
Fecha dentro del ciclo: 2019-04-13
Fecha dentro del ciclo: 2019-04-14
Fecha dentro del ciclo: 2019-04-15
Fecha dentro del ciclo: 2019-04-16
Fecha dentro del ciclo: 2019-04-17
Fecha dentro del ciclo: 2019-04-18
No tuvimos que modificar ningún otro valor, solamente las fechas. Esta es la ventaja de trabajar con las fechas como se debe en lugar de crear algoritmos complejos.
Ahora que ya hicimos esto podemos jugar un poco más.
Hagamos esto un poco más divertido, haciendo que el ciclo avance una hora a la vez. Hay que modificar el incremento y formatear la fecha de distinta manera, nada complejo:
<?php
/*
Hacer ciclos con fechas para ir desde un período
a otro, iterando hora a hora usando strtotime y date
@author parzibyte
*/# Definir rangos de fechas.
# Nota: podríamos definirlas sin horas, pero es mejor ser explícitos
$fechaInicio = "2019-03-18 00:00:00";
$fechaFin = "2019-03-21 00:00:00";
# Fecha como segundos
$tiempoInicio = strtotime($fechaInicio);
$tiempoFin = strtotime($fechaFin);
#60 minutos por hora * 60 segundos por minuto
$hora = 3600;
while($tiempoInicio <= $tiempoFin){
# Podemos recuperar la fecha actual y formatearla
# Más información: http://php.net/manual/es/function.date.php
$fechaActual = date("Y-m-d H:i:s", $tiempoInicio);
printf("Fecha y hora dentro del ciclo: %s\n", $fechaActual);
# Sumar el incremento para que en algún momento termine el ciclo
$tiempoInicio += $hora;
}
El algoritmo en general no cambió, simplemente cambia el formato y el step. La salida es la siguiente:
Fecha y hora dentro del ciclo: 2019-03-18 00:00:00
Fecha y hora dentro del ciclo: 2019-03-18 01:00:00
Fecha y hora dentro del ciclo: 2019-03-18 02:00:00
Fecha y hora dentro del ciclo: 2019-03-18 03:00:00
Fecha y hora dentro del ciclo: 2019-03-18 04:00:00
Fecha y hora dentro del ciclo: 2019-03-18 05:00:00
Fecha y hora dentro del ciclo: 2019-03-18 06:00:00
Fecha y hora dentro del ciclo: 2019-03-18 07:00:00
Fecha y hora dentro del ciclo: 2019-03-18 08:00:00
Fecha y hora dentro del ciclo: 2019-03-18 09:00:00
Fecha y hora dentro del ciclo: 2019-03-18 10:00:00
Fecha y hora dentro del ciclo: 2019-03-18 11:00:00
Fecha y hora dentro del ciclo: 2019-03-18 12:00:00
Fecha y hora dentro del ciclo: 2019-03-18 13:00:00
Fecha y hora dentro del ciclo: 2019-03-18 14:00:00
Fecha y hora dentro del ciclo: 2019-03-18 15:00:00
Fecha y hora dentro del ciclo: 2019-03-18 16:00:00
Fecha y hora dentro del ciclo: 2019-03-18 17:00:00
Fecha y hora dentro del ciclo: 2019-03-18 18:00:00
Fecha y hora dentro del ciclo: 2019-03-18 19:00:00
Fecha y hora dentro del ciclo: 2019-03-18 20:00:00
Fecha y hora dentro del ciclo: 2019-03-18 21:00:00
Fecha y hora dentro del ciclo: 2019-03-18 22:00:00
Fecha y hora dentro del ciclo: 2019-03-18 23:00:00
Fecha y hora dentro del ciclo: 2019-03-19 00:00:00
Fecha y hora dentro del ciclo: 2019-03-19 01:00:00
Fecha y hora dentro del ciclo: 2019-03-19 02:00:00
Fecha y hora dentro del ciclo: 2019-03-19 03:00:00
Fecha y hora dentro del ciclo: 2019-03-19 04:00:00
Fecha y hora dentro del ciclo: 2019-03-19 05:00:00
Fecha y hora dentro del ciclo: 2019-03-19 06:00:00
Fecha y hora dentro del ciclo: 2019-03-19 07:00:00
Fecha y hora dentro del ciclo: 2019-03-19 08:00:00
Fecha y hora dentro del ciclo: 2019-03-19 09:00:00
Fecha y hora dentro del ciclo: 2019-03-19 10:00:00
Fecha y hora dentro del ciclo: 2019-03-19 11:00:00
Fecha y hora dentro del ciclo: 2019-03-19 12:00:00
Fecha y hora dentro del ciclo: 2019-03-19 13:00:00
Fecha y hora dentro del ciclo: 2019-03-19 14:00:00
Fecha y hora dentro del ciclo: 2019-03-19 15:00:00
Fecha y hora dentro del ciclo: 2019-03-19 16:00:00
Fecha y hora dentro del ciclo: 2019-03-19 17:00:00
Fecha y hora dentro del ciclo: 2019-03-19 18:00:00
Fecha y hora dentro del ciclo: 2019-03-19 19:00:00
Fecha y hora dentro del ciclo: 2019-03-19 20:00:00
Fecha y hora dentro del ciclo: 2019-03-19 21:00:00
Fecha y hora dentro del ciclo: 2019-03-19 22:00:00
Fecha y hora dentro del ciclo: 2019-03-19 23:00:00
Fecha y hora dentro del ciclo: 2019-03-20 00:00:00
Fecha y hora dentro del ciclo: 2019-03-20 01:00:00
Fecha y hora dentro del ciclo: 2019-03-20 02:00:00
Fecha y hora dentro del ciclo: 2019-03-20 03:00:00
Fecha y hora dentro del ciclo: 2019-03-20 04:00:00
Fecha y hora dentro del ciclo: 2019-03-20 05:00:00
Fecha y hora dentro del ciclo: 2019-03-20 06:00:00
Fecha y hora dentro del ciclo: 2019-03-20 07:00:00
Fecha y hora dentro del ciclo: 2019-03-20 08:00:00
Fecha y hora dentro del ciclo: 2019-03-20 09:00:00
Fecha y hora dentro del ciclo: 2019-03-20 10:00:00
Fecha y hora dentro del ciclo: 2019-03-20 11:00:00
Fecha y hora dentro del ciclo: 2019-03-20 12:00:00
Fecha y hora dentro del ciclo: 2019-03-20 13:00:00
Fecha y hora dentro del ciclo: 2019-03-20 14:00:00
Fecha y hora dentro del ciclo: 2019-03-20 15:00:00
Fecha y hora dentro del ciclo: 2019-03-20 16:00:00
Fecha y hora dentro del ciclo: 2019-03-20 17:00:00
Fecha y hora dentro del ciclo: 2019-03-20 18:00:00
Fecha y hora dentro del ciclo: 2019-03-20 19:00:00
Fecha y hora dentro del ciclo: 2019-03-20 20:00:00
Fecha y hora dentro del ciclo: 2019-03-20 21:00:00
Fecha y hora dentro del ciclo: 2019-03-20 22:00:00
Fecha y hora dentro del ciclo: 2019-03-20 23:00:00
Fecha y hora dentro del ciclo: 2019-03-21 00:00:00
Ya no pondré el código, pues con los ejemplos de arriba se entiende. Pero con este enfoque podemos hacer un ciclo que avance minuto a minuto o segundo a segundo. También podríamos hacer que avance cada 15 minutos.
Recuerda que puedes descargar el código y ejecutarlo con la terminal; incluso puedes hacerlo en Android.
Te invito a ver más sobre PHP o algoritmos con fechas en mi blog.
Hoy te voy a presentar un creador de credenciales que acabo de programar y que…
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Esta web usa cookies.