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

 ?>