Как я могу получить X дат в диапазоне с минимальным интервалом в 1 минуту?

Я хочу получить случайные значения даты и времени на основе заданного диапазона дат.

Пример: дата начала: 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?

1

Решение

Это должно работать для вас:

Здесь я создаю 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);

?>
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]