Hacer ciclos con fechas en PHP

Ciclo while con fechas en PHP

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.

Hacer ciclos con fechas en PHP
Hacer ciclos con fechas en PHP

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.

Fecha como segundos desde fecha Unix

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.

El ciclo while con su incremento

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.

Iterar fechas con PHP: 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.

Un rango más alto

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.

Ciclo while con fecha y hora en PHP

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

Avanzar con horas, minutos y segundos

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.

Conclusión

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.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario

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