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í.
Ahora, para sacar una fecha aleatoria podemos simplemente llamar a la función date
y pasarle como milisegundos un número aleatorio generado con mt_rand
así:
<?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.
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.
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.