Php 如何在最小间隔为1分钟的范围内获得X个日期?
我想根据给定的日期范围得到一些随机的日期和时间值 示例:开始日期:Php 如何在最小间隔为1分钟的范围内获得X个日期?,php,date,datetime,time,dateinterval,Php,Date,Datetime,Time,Dateinterval,我想根据给定的日期范围得到一些随机的日期和时间值 示例:开始日期: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 = strtoti
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";
}
}
rand_date($min_date、$max_date、$total_number);
函数rand\u date($min\u date、$max\u date、$total\u number)
{
$min_epoch=strotime($min_date);
$max\u epoch=strottime($max\u date);
对于($i=0;$i这应该适用于您:
在这里,我创建了一个1分钟的数组。在此之后,我循环通过$period
并将日期保存到一个数组中。在此之后,我创建数组并获取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);
?>
编辑:
如果您不希望静态间隔为1分钟,但仍然希望每个日期之间至少间隔1分钟,则可以使用以下方法:
(这里我只是将间隔设置为1秒,然后以这种方式过滤数组,每个元素之间至少间隔1分钟)
那么问题出在哪里呢?我没有时间真正实现它,但是下面呢:不要一次获取所有随机值。我会将这些值存储在一个数组中。只要该数组的条目数不超过15个,就获取另一个随机值。如果新值满足条件(距离我们找到的每个值至少一分钟),将其写入数组。如果它不符合条件,则不要将其写入数组;)我无意冒犯@Rizier123,但我不确定计算每一个可能的解决方案,然后随机选择其中一些是非常有效的。我将在问题中添加一条注释,勾勒出一种我认为可能更有效的方法。
<?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
)
<?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);
?>