如何获得最小间隔为 1 分钟的范围内的 X 个日期?

How can I get X dates in a range with a minimum interval of 1 minute?

我想根据给定的日期范围获取一些随机日期和时间值。

例如:开始日期: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 分钟?

这应该适合你:

这里我创建了一个 DatePeriod with a DateInterval of 1 minute. After this I loop through $period and save the dates into an array. After this I shuffle() the array and take an 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);

 ?>