You probably want to determine the resolution, for example, one minute or three minutes or 15 seconds or a half days and what not. Randomness should apply for the entire period, I chose one minute here for exemplary purposes (there are 132480 minutes in your period).
$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];
This, for example, gives:
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" }
You can find RandomIterator here . Without it, a little more is needed (about 1.5 iterations compared to the above example), using:
$count = iterator_count($period); $random = rand(1, $count); $limited = new LimitIterator(new IteratorIterator($period), $random - 1, 1); $limited->rewind(); $result = $limited->current();
I also tried with seconds, but it will take quite a while. You probably want to find a random day (92 days) first, and then some random time in it.
I also performed some tests, and I could not find any use when using DatePeriod while you are using general permissions like seconds:
$start = new Datetime('1st October 2012'); $end = new Datetime('1st Jan 2013'); $random = new DateTime('@' . mt_rand($start->getTimestamp(), $end->getTimestamp()));
or minutes:
$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);