PHP for循环日期

时间:2015-01-20 17:23:22

标签: 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 = strtotime('2015-01-10 08:00:00');
$end = strtotime('2015-01-20 10:57:59');

for ($i=$start;$i<$end;$i++) {

  //Current time + Anywhere between 1 hour and 3 days
   $x = $i + (int)rand(3600,259200);  

   echo "<p>" . date('Y-m-d H:i:s', $x) . "</p>";       
}

在我的测试中,我没有得到任何结果......我相信循环无限运行......或其他错误。

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

如果我正确地收集你的问题,看起来你的方式错了。最简单的方法是生成范围内的随机时间($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>";       

}

答案 1 :(得分:0)

您认为这两个将是您的约会

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

PS。注意我使用了mt_rand函数

答案 2 :(得分:-1)

使用日期值的毫秒表示。伪代码如下:

  1. 将开始日期转换为毫秒表示sm
  2. 将结束日期转换为毫秒表示em
  3. 对于i = 0到n,n是日期数...
    3.1随机化smsm + offset之间的某个值 3.2将生成的值转换为其日期对象表示

    3.3分配sm = sm + offset并检查是否sm < em

    offset是采样间隔{@ 1}}

  4. 的大小