PHP 表示循环日期


PHP for loop dates

我正在尝试创建一个 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>";       
}

在我的测试中,我没有得到任何结果...我相信循环正在无限运行...或者别的什么问题。

谁能帮忙?

如果我正确收集您的问题,那么您似乎走错了路。最简单的方法是在一定范围内($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 = 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);
}

请注意,我使用了mt_rand函数

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

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

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

    offset是采样间隔的大小,offset <= (em - sm) / n