Я хочу получить случайные значения даты и времени на основе заданного диапазона дат.
Пример: дата начала: 2015-04-29 08:00:00
и дата окончания: 2015-04-29 20:00:00
,
Теперь я хочу получить 15 случайных значений даты и времени, и это должно быть с интервалом не менее 1 минуты.
Я попробовал следующий код:
rand_date($min_date, $max_date,$total_number);
function rand_date($min_date, $max_date,$total_number)
{
$min_epoch = strtotime($min_date);
$max_epoch = strtotime($max_date);
for($i=0;$i<=$total_number;$i++)
{
$rand_epoch = rand($min_epoch, $max_epoch);
echo "in::".date('Y-m-d H:i:s', $rand_epoch)."\n\n";
}
}
токовый выход:
in::2015-04-29 17:41:13 //<-
in::2015-04-29 17:41:15 //<-
in::2015-04-29 15:38:39
in::2015-04-29 17:41:50 //<-
in::2015-04-29 17:45:21
in::2015-04-29 11:50:57
in::2015-04-29 19:34:12
in::2015-04-29 14:05:55
in::2015-04-29 11:25:36
in::2015-04-29 15:46:53
in::2015-04-29 14:55:44
in::2015-04-29 19:53:30
in::2015-04-29 18:28:03
in::2015-04-29 08:52:13
in::2015-04-29 17:59:42
Как вы можете видеть в приведенном выше результате, я выделил несколько записей, в которых есть только расстояние, основанное на секундах, но на самом деле мне нужно расстояние не менее 1 минуты во всех значениях даты и времени.
Как я могу заставить код работать, чтобы минимальный интервал составлял 1 минуту между каждым dateTimes?
Это должно работать для вас:
Здесь я создаю DatePeriod
с DateInterval
от 1 минуты. После этого я перебираю $period
и сохранить даты в массиве. После этого я shuffle()
массив и взять array_slice()
из 15 элементов.
<?php
$start = new DateTime("2015-04-29 08:00:00");
$interval = new DateInterval("PT1M");
$end = (new DateTime("2015-04-29 20:00:00"))->add($interval);
$period = new DatePeriod($start, $interval, $end);
foreach($period as $date)
$dates[] = $date->format("Y-m-d H:i:s");
shuffle($dates);
$result = array_slice($dates, 0 ,15);
print_r($result);
?>
Возможный вывод:
Array
(
[0] => 2015-04-29 09:37:00
[1] => 2015-04-29 14:41:00
[2] => 2015-04-29 18:30:00
[3] => 2015-04-29 15:37:00
[4] => 2015-04-29 17:37:00
[5] => 2015-04-29 09:18:00
[6] => 2015-04-29 08:18:00
[7] => 2015-04-29 10:39:00
[8] => 2015-04-29 14:15:00
[9] => 2015-04-29 13:45:00
[10] => 2015-04-29 13:06:00
[11] => 2015-04-29 10:04:00
[12] => 2015-04-29 18:24:00
[13] => 2015-04-29 13:47:00
[14] => 2015-04-29 18:15:00
)
РЕДАКТИРОВАТЬ:
Если вы не хотите, чтобы статический интервал составлял 1 минуту, но вы все еще хотите, чтобы между датами была минимальная 1 минута, вы можете использовать это:
(Здесь я просто устанавливаю интервал в 1 секунду, а затем фильтрую массив таким образом, чтобы между каждым элементом была не менее 1 минуты)
<?php
$start = new DateTime("2015-04-29 08:00:00");
$interval = new DateInterval("PT1S");
$end = (new DateTime("2015-04-29 20:00:00"))->add($interval);
$period = new DatePeriod($start, $interval, $end);
foreach($period as $date)
$dates[] = $date->format("Y-m-d H:i:s");
shuffle($dates);
$pre = $start->getTimestamp();
$dates = array_filter($dates, function($v)use(&$pre){
if(abs(strtotime($v) - $pre) >= 60) {
$pre = strtotime($v);
return TRUE;
} else {
$pre = strtotime($v);
return FALSE;
}
});
$result = array_slice($dates, 0 ,15);
print_r($result);
?>
Других решений пока нет …