Vous voulez probablement définir une résolution, par exemple une minute, ou trois minutes ou 15 secondes ou un et une demi-journée ou de ce pas. Le hasard doit être appliqué sur toute la période, j'ai choisi une minute ici pour des fins exemplaires (il y a 132480 minutes dans votre période).
$start = new Datetime('1st October 2012');
$end = new Datetime('1st Jan 2013');
$interval = new DateInterval('PT1M'); // Resolution: 1 Minute
$period = new DatePeriod($start, $interval, $end);
$random = new RandomIterator($period);
list($result) = iterator_to_array($random, false) ? : [null];
Ce par exemple donne:
class DateTime#7 (3) {
public $date =>
string(19) "2012-10-16 02:06:00"
public $timezone_type =>
int(3)
public $timezone =>
string(13) "Europe/Berlin"
}
Vous pouvez find the RandomIterator
here. Sans elle, il faudra un peu plus (environ 1,5 le nombre d'itérations par rapport à l'exemple ci-dessus) en utilisant:
$count = iterator_count($period);
$random = rand(1, $count);
$limited = new LimitIterator(new IteratorIterator($period), $random - 1, 1);
$limited->rewind();
$result = $limited->current();
J'ai aussi essayé avec les secondes, mais cela prendrait assez long. Vous voulez probablement d'abord trouver un jour au hasard (92 jours), puis un peu de temps au hasard.
Aussi j'ai couru quelques tests et je ne pouvais trouver aucun avantage à utiliser DatePeriod
pour autant que vous êtes sur les résolutions communes comme seconde:
$start = new Datetime('1st October 2012');
$end = new Datetime('1st Jan 2013');
$random = new DateTime('@' . mt_rand($start->getTimestamp(), $end->getTimestamp()));
ou minutes:
/**
* @param DateTime $start
* @param DateTime $end
* @param int|DateInterval $resolution in Seconds or as DateInterval
* @return DateTime
*/
$randomTime = function (DateTime $start, DateTime $end, $resolution = 1) {
if ($resolution instanceof DateInterval) {
$interval = $resolution;
$resolution = ($interval->m * 2.62974e6 + $interval->d) * 86400 + $interval->h * 60 + $interval->s;
}
$startValue = floor($start->getTimestamp()/$resolution);
$endValue = ceil($end->getTimestamp()/$resolution);
$random = mt_rand($startValue, $endValue) * $resolution;
return new DateTime('@' . $random);
};
$random = $randomTime($start, $end, 60);
C'est facile - vous avez besoin d'un horodatage aléatoire. Puis, à partir de l'horodatage aléatoire, vous pourrez extraire l'heure ... – Yang
Avez-vous essayé quelque chose? –
Voulez-vous inclure le 1er octobre et le 1er janvier dans les dates aléatoires ou seulement entre eux? – Ray