Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环日期的PHP_Php_Date_For Loop - Fatal编程技术网

循环日期的PHP

循环日期的PHP,php,date,for-loop,Php,Date,For Loop,我正在尝试创建一个for循环,其中我指定了开始日期和结束日期,我希望随机抽取一组日期,其中每个日期总是晚于它的前一个日期,而早于下一个数字 我不需要预先定义日期集,我可能有10个-我可能有100个或1000个,只要它们存在于开始和结束日期内 例如: 2015-01-15 08:06:00 2015-01-15 15:23:42 2015-01-16 06:03:00 ......... ......... 2015-01-20 08:18:32 这就是我所拥有的(这是错误的): $start=

我正在尝试创建一个for循环,其中我指定了开始日期和结束日期,我希望随机抽取一组日期,其中每个日期总是晚于它的前一个日期,而早于下一个数字

我不需要预先定义日期集,我可能有10个-我可能有100个或1000个,只要它们存在于开始和结束日期内

例如:

2015-01-15 08:06:00
2015-01-15 15:23:42
2015-01-16 06:03:00
.........
.........
2015-01-20 08:18:32
这就是我所拥有的(这是错误的):

$start=strotime('2015-01-10 08:00:00');
$end=strotime('2015-01-20 10:57:59');

对于($i=$start;$i使用日期值的毫秒表示形式。伪代码如下:

  • 将开始日期转换为其毫秒表示形式
    sm
  • 将结束日期转换为其毫秒表示形式
    em
  • 对于i=0到n,
    n
    是日期数…
    3.1将
    sm
    sm+偏移量之间的一些值随机化

    3.2将生成的值转换为其日期对象表示形式

    3.3分配
    sm=sm+offset
    并检查
    sm


    offset
    是采样间隔的大小,
    offset如果我正确地收集了您的问题,您似乎走错了方向。最简单的方法是在一定范围内生成随机时间(介于
    $start
    $end
    之间)然后对它们进行排序,这样你就不必猜测在选择一个随机间隔时,你还剩下多少时间空间

    $start = strtotime('2015-01-10 08:00:00');
    $end = strtotime('2015-01-20 10:57:59');
    
    
    $num_randoms = 10;
    
    for ($i=0;$i<$num_randoms;$i++) {
    
       $dates []= (int)rand($start,$end);  
    
    }
    
    sort($dates);
    foreach ($dates as $x) {
    
       echo "<p>" . date('Y-m-d H:i:s', $x) . "</p>";       
    
    }
    
    $start=strotime('2015-01-10 08:00:00');
    $end=strotime('2015-01-20 10:57:59');
    $num_randoms=10;
    
    对于($i=0;$i您假设这两个是您的约会对象

    $start = strtotime('2015-01-10 08:00:00');
    $end = strtotime('2015-01-20 10:57:59');
    
    您还假设将使用特定的秒数范围生成伪随机数

    $min = 3600; // 1 hour
    $max = 259200; // 72 hours (3 days)
    
    您需要做的第一步是以最大范围减少结束秒数。这将确保后一个日期在指定日期之前

    $end -= $max;
    
    最后是正确的循环。我使用了
    while
    循环,因为它更可读

    while ($start < $end) {
        $start += (int) mt_rand($min, $max); // add the generated value to the start seconds
        echo date('Y-m-d H:i:s', $start);
    }
    
    while($start<$end){
    $start+=(int)mt_rand($min,$max);//将生成的值添加到开始秒
    回显日期('Y-m-d H:i:s',$start);
    }
    

    请注意,我使用了函数

    您的逻辑似乎有缺陷。如果在当前日期序列中添加一个随机的时间量,使您超过结束日期,但仍然少于您要生成的日期数,会发生什么情况?您似乎需要做的是查看开始日期和结束日期之间的时间以及迭代次数ns来确定日期之间的平均日期间隔,然后引入抖动来随机化+-一些时间到该平均值。然后,您需要查看距离结束的剩余时间,并在每次迭代中重新计算。您的varibale
    $end
    等于1421769479:),这是一个巨大的数字number@smarber但是
    $start
    也是一个巨大的数字,比
    $end
    小约100万个循环的数量约为865k。这是一个需要一些时间才能完成的大量迭代(我猜是十几秒)并产生大约24个MiB的输出。不是说它没有结束运行,而是浏览器没有优化以处理和呈现如此大的文档。你只是因为引入了必须排序的需要而使代码变得更加复杂。@ultrajohn但是工作正常。如果没有排序,你如何得到排序结果?@martti请检查我的建议回答上面的问题。@ultrajohn将给出不同的结果,在每个等距时间段中随机(您的答案)与在开始和结束之间随机(amphetmachine)。OP想要获得什么还不是很清楚。@martti这让我很好奇,所以我在stat.se.com上询问了它。这似乎比for循环好得多,但我无法让它工作。它显示为空白。此解决方案存在多个问题:1)日期在范围内分布太均匀;2) 如果
    offset==(em-sm)/n
    它将生成
    n-1
    日期。相比之下
    while ($start < $end) {
        $start += (int) mt_rand($min, $max); // add the generated value to the start seconds
        echo date('Y-m-d H:i:s', $start);
    }