2009-12-29 82 views
44

Estoy codificación de una aplicación en la que necesito para asignar fecha aleatoria entre dos marcas de tiempo fijosCómo generar una fecha aleatoria entre dos fechas usando php?

cómo puedo lograr esto utilizando php He buscado primero, pero sólo encontré la respuesta para Java no php

por ejemplo:

$string = randomdate(1262055681,1262055681); 
+2

¿Soy yo, o los límites son los mismos? :) – PJunior

+0

a partir de 2016 La respuesta de @Sam debe ser la aceptada ya que todos deberíamos movernos a 'DateTime' en lugar de usar' date'-functions. – Hafenkranich

+0

-1: ¿Las dos marcas de tiempo imputadas son iguales? ¡No obtendrás ningún azar! +1 porque es una buena pregunta. – wpcoder

Respuesta

76

PHP tiene la función rand():

$int= rand(1262055681,1262055681); 

también cuenta mt_rand(), que generalmente se supone que tienen una mejor aleatoriedad en los resultados:

$int= mt_rand(1262055681,1262055681); 

Para activar una marca de tiempo en una cadena, puede utilizar date(), es decir:

$string = date("Y-m-d H:i:s",$int); 
+4

Para agregar a eso, una vez que aparece su número aleatorio, trátelo como una nueva marca de tiempo y construya una fecha a partir de él. –

+1

@Sudhir - definitivamente. @NetCaster - Puede usar la función 'date()' para crear una cadena de fecha fuera de una marca de tiempo muy fácilmente. – zombat

+2

eg: date ('Y-m-d', $ int); – gahooa

23

Usted sólo puede utilizar un número aleatorio para determinar una fecha aleatoria. Obtenga un número aleatorio entre 0 y el número de días entre las fechas. Luego solo agrega ese número a la primera fecha.

Por ejemplo, para obtener una fecha de números aleatorios entre hoy y 30 días.

echo date('Y-m-d', strtotime('+'.mt_rand(0,30).' days')); 
+1

con una función tan pequeña y genial como" hackear "! muy agradable ... – krembo99

8

He aquí otro ejemplo:

$datestart = strtotime('2009-12-10');//you can change it to your timestamp; 
$dateend = strtotime('2009-12-31');//you can change it to your timestamp; 

$daystep = 86400; 

$datebetween = abs(($dateend - $datestart)/$daystep); 

$randomday = rand(0, $datebetween); 

echo "\$randomday: $randomday\n"; 

echo date("Y-m-d", $datestart + ($randomday * $daystep)) . "\n"; 
32

Si las fechas dadas son en formato de fecha y hora después utilizar esta forma más fácil de hacer esto es convertir los dos números para las marcas de tiempo, a continuación, establecer estos como el mínimo y máximo límites en un generador de números aleatorios.

Un ejemplo de PHP rápida sería:

// Find a randomDate between $start_date and $end_date 
function randomDate($start_date, $end_date) 
{ 
    // Convert to timetamps 
    $min = strtotime($start_date); 
    $max = strtotime($end_date); 

    // Generate random number using above bounds 
    $val = rand($min, $max); 

    // Convert back to desired date format 
    return date('Y-m-d H:i:s', $val); 
} 

Esta función hace uso de strtotime() según lo sugerido por zombat para convertir una descripción de fecha y hora en una marca de tiempo Unix, y la fecha() para hacer una fecha válida fuera de la marca de tiempo aleatoria que se ha generado.

6

Otra solución utilizando los PHP DateTime

$start_date y $end_date son objetos DateTime

private static function random_date_in_range($start_date, $end_date) { 
    $new_date_timestamp = mt_rand($start_date->getTimestamp(), $end_date->getTimestamp()); 
    $random_date = new DateTime(); 
    $random_date->setTimestamp($new_date_timestamp); 
    return $random_date; 
} 
+0

Todos deberíamos movernos a 'DateTime' en lugar de' date() '-functions. Dicho esto, esta es la mejor solución. – Hafenkranich

-1

más simple de todos, esta pequeña función funciona para mí Lo escribí en una clase de ayuda datetime como estática método

/** 
* Return date between two dates 
* 
* @param String $startDate 
* @param String $endDate 
* @return String 
* 
* @author Kuldeep Dangi <[email protected]> 
*/ 
public static function getRandomDateTime($startDate, $endDate) 
{ 
    $randomTime = mt_rand(strtotime($startDate), strtotime($endDate)); 
    return date(self::DATETIME_FORMAT_MYSQL, $randomTime); 

} 
-1
$yeni_tarih = date('Y-m-d', strtotime('+'.mt_rand(-90,0).' days'))." ".date('H', strtotime('+'.mt_rand(0,24).' hours')).":".rand(1,59).":".rand(1,59); 

fecha aleatoria Completo y Tiempo

3

La mejor manera:

$timestamp = rand(strtotime("Jan 01 2015"), strtotime("Nov 01 2016")); 
$random_Date = date("d.m.Y", $timestamp); 
3

Mediante el uso de carbon y php rand entre dos fechas

$startDate = Carbon::now(); 
$endDate = Carbon::now()->subDays(7); 

$randomDate = Carbon::createFromTimestamp(rand($endDate->timestamp, $startDate->timestamp))->format('Y-m-d'); 

O

$randomDate = Carbon::now()->subDays(rand(0, 7))->format('Y-m-d'); 
2

El importe o f strtotime aquí es demasiado alto.
Para cualquier persona cuyos intereses se extienden antes de 1971 y después de 2038, he aquí una solución moderna y flexible:

function random_date_in_range($date1, $date2){ 
    if (!is_a($date1, 'DateTime')) { 
     $date1 = new DateTime((ctype_digit((string)$date1) ? '@' : '') . $date1); 
     $date2 = new DateTime((ctype_digit((string)$date2) ? '@' : '') . $date2); 
    } 
    $random_u = random_int($date1->format('U'), $date2->format('U')); 
    $random_date = new DateTime(); 
    $random_date->setTimestamp($random_u); 
    return $random_date->format('Y-m-d') .'<br>'; 
} 

de llamadas que cualquier número de maneras ...

// timestamps 
echo random_date_in_range(157766400,1489686923); 

// any date string 
echo random_date_in_range('1492-01-01','2050-01-01'); 

// English textual parsing 
echo random_date_in_range('last Sunday','now'); 

// DateTime object 
$date1 = new DateTime('1000 years ago'); 
$date2 = new DateTime('now + 10 months'); 
echo random_date_in_range($date1, $date2); 

Como es, la función requiere date1 < = date2.

0

Bastante buena pregunta; necesario para generar algunos datos de muestra aleatorios para una aplicación.

Se podría utilizar el following function con argumentos opcionales para generar fechas aleatorias: entrada

function randomDate($startDate, $endDate, $format = "Y-M-d H:i:s", $timezone = "gmt", $mode = "debug") 
{ 
    return $result; 
} 

muestra:

echo 'UTC: ' . randomDate("1942-01-19", "2016-06-03", "Y-M-d H:i:s", "utc") . '<br>'; 
//1942-Jan-19 07:00:00 

echo 'GMT: ' . randomDate("1942-01-19", "2016-06-03", "Y/M/d H:i A", "gmt") . '<br>'; 
//1942/Jan/19 00:00 AM 

echo 'France: ' . randomDate("1942-01-19", "2016-06-03", "Y F", "Europe/Paris") . '<br>'; 
//1942 January 

echo 'UTC - 4 offset time only: ' . randomDate("1942-01-19", "2016-06-03", "H:i:s", -4) . '<br>'; 
//20:00:00 

echo 'GMT +2 offset: ' . randomDate("1942-01-19", "2016-06-03", "Y-M-d H:i:s", 2) . '<br>'; 
//1942-Jan-19 02:00:00 

echo 'No Options: ' . randomDate("1942-01-19", "2016-06-03") . '<br>'; 
//1942-Jan-19 00:00:00 

lectores requisitos podrían variar de aplicación a otra, en la esperanza general de esta función es una herramienta práctica donde necesita generar algunas fechas aleatorias/datos de muestra para su aplicación.

Tenga en cuenta que la función inicialmente en modo de depuración, por lo que el cambio a $mood="" aparte de depuración en la producción.

La función acepta:

  1. fecha de inicio
  2. fecha de finalización
  3. formato: cualquier aceptado PHP formato de fecha u hora
  4. zona horaria: nombre o número de desplazamiento modo de
  5. : depuración, época, época verbosa o verbosa

la salida en no depurar El modo es un número aleatorio de acuerdo con las especificaciones opcionales.

probado con 7.x PHP

Cuestiones relacionadas