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

时间:2015-04-29 07:36:53

标签: 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 = 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分钟?

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);

 ?>