PHP for 循环日期

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>";       
}

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

有人能帮忙吗?

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

  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

如果我正确地收集了你的问题,那么你似乎正在以错误的方式解决问题。最简单的方法是生成一个范围内的随机时间(在 $start$end 之间),然后对它们进行排序。这样您就不必猜测在选择随机间隔时还剩下多少时间-space。

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

PS。注意我使用了 mt_rand 函数