我希望根据给定的日期范围获得一些随机的日期和时间值。
例如:开始日期: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分钟的距离。
如何使代码生效,以便每个dateTimes之间至少间隔1分钟?
答案 0 :(得分:1)
这应该适合你:
在这里,我创建一个DatePeriod
,其中DateInterval
为1分钟。在此之后,我遍历$period
并将日期保存到数组中。在此之后我shuffle()
数组并获取15个元素的array_slice()
。
<?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);
?>