Generar fechas aleatorias en un rango usando PHP y mt_rand

Tal vez en alguna ocasión tengamos que generar fechas aleatorias en PHP. En este post explicaré resumidamente cómo podemos hacerlo.

PHP tiene la función date que toma como primer argumento el formato (por ejemplo Y-m-d nos daría algo como 2017-01-25) y como segundo (opcional) el número de milisegundos de los que queremos que nos devuelva la fecha.

Es decir, como segundo parámetro podemos poner los milisegundos transcurridos desde el 1 de enero de 1970 para formatearlos como cadena. Para entender mejor, veamos este ejemplo:

<?php
echo date("Y-m-d", 0);
//Salida -> 1969-12-31
?>

Como en este caso le pasamos un 0 como argumento, nos devolvió la fecha del 31 de diciembre de 1969.

Se supone que debería devolver la fecha del 1 de enero de 1970, ¿no? pues sí, pero como el tiempo unix está basado en UTC, y nosotros no estamos en la misma zona horaria a veces nos devolverá diferentes resultados. Más información aquí

Entonces, si le ponemos 1000 milisegundos nos dará la fecha del 1 de enero mas un segundo, si le ponemos 3,600,000 ( 1000 * 60 * 60) nos dará la fecha del 1 de enero mas una hora, y así.

Fecha aleatoria con PHP

Ahora, para sacar una fecha aleatoria podemos simplemente llamar a la función datey pasarle como milisegundos un número aleatorio generado con mt_randasí:

<?php
echo date("Y-m-d", mt_rand(0, 500000000));
//Salida -> 1979-08-08, o una fecha como esas, ya que será aleatoria
?>

Llamamos a date con el mismo formato, pero en lugar de un número definido por nosotros, dejamos que mt_rand se encargue.

mt_rand recibe un mínimo y un máximo, y nos devuelve un número que se encuentre entre esos límites.

Fecha aleatoria en rango con PHP

De esa forma podemos generar una fecha aleatoria.

Ahora, ¿qué pasa si queremos generar una fecha aleatoria entre dos fechas? es decir, llamar a la función y decirle “quiero que me des una fecha aleatoria entre el 1 de septiembre del 2017 y el 15 de septiembre del 2018”

Aquí entra otra función, strtotime que convierte una cadena a milisegundos. Es decir, la llamamos así:

<?php
echo strtotime("2017-09-18");
//Salida -> 1505707200
?>

Y dependiendo de la fecha que le pasemos como string, nos dará el número de milisegundos. Obviamente podemos especificar más formatos. Veamos el siguiente ejemplo:

<?php
echo strtotime("2017-09-18 15:52:55");
//Salida -> 1505764375
?>

Aquí le pasamos una fecha junto con la hora. Y nos devuelve el número de milisegundos exactos.

Entonces si combinamos todas estas funciones, al final podremos crear una función que devuelva una fecha aleatoria entre dos fechas que el usuario defina. Vamos a crearla

<?php
/**
*	@author parzibyte
*
*	@param string $formato El formato en el que deseamos que devuelva la fecha.
*	por defecto es Y-m-d (2017-01-01)
*
*	@param string $limiteInferior Lí­mite inferior desde donde queremos que tome la fecha.
*	Por defecto es el 1 de enero de 1970
*
*	@param string $limiteSuperior Límite superior. Por defecto es el 1 de enero del 2038
*
*	@return string La fecha aleatoria
*/
function fecha_aleatoria($formato = "Y-m-d", $limiteInferior = "1970-01-01", $limiteSuperior = "2038-01-01"){
	// Convertimos la fecha como cadena a milisegundos
	$milisegundosLimiteInferior = strtotime($limiteInferior);
	$milisegundosLimiteSuperior = strtotime($limiteSuperior);

	// Buscamos un número aleatorio entre esas dos fechas
	$milisegundosAleatorios = mt_rand($milisegundosLimiteInferior, $milisegundosLimiteSuperior);

	// Regresamos la fecha con el formato especificado y los milisegundos aleatorios
    return date($formato, $milisegundosAleatorios);
}
?>

Veamos algunos ejemplos de cómo podemos usar esta función.

<?php
echo fecha_aleatoria(); // Salida -> Algo como 2023-08-29

echo fecha_aleatoria("Y-m-d H-i-s"); // Salida -> Algo como 2024-03-18 18-20-48

echo fecha_aleatoria("Y-m-d", "2017", "2018"); // Salida -> Algo como 2017-09-19

echo fecha_aleatoria("Y-m-d H:i:s", "2017-09", "2017-10"); // Salida -> Algo como 2017-09-28 19:21:41
?>

Y así podemos jugar mientras el formato sea válido. Si queremos ver más opciones para formatear la fecha puedes leer este post.

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 *