循环日期的PHP
我正在尝试创建一个for循环,其中我指定了开始日期和结束日期,我希望随机抽取一组日期,其中每个日期总是晚于它的前一个日期,而早于下一个数字 我不需要预先定义日期集,我可能有10个-我可能有100个或1000个,只要它们存在于开始和结束日期内 例如:循环日期的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=
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);
}