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>";
}
在我的测试中,我没有得到任何结果...我认为循环是 运行 无限...或者其他错误。
有人能帮忙吗?
使用您的日期值的毫秒表示法。伪代码如下:
- 将开始日期转换为其毫秒表示法
sm
- 将结束日期转换为其毫秒表示形式
em
对于 i = 0 到 n,n
是日期数...
3.1 在 sm
和 sm + 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 函数
我正在尝试创建一个 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>";
}
在我的测试中,我没有得到任何结果...我认为循环是 运行 无限...或者其他错误。
有人能帮忙吗?
使用您的日期值的毫秒表示法。伪代码如下:
- 将开始日期转换为其毫秒表示法
sm
- 将结束日期转换为其毫秒表示形式
em
对于 i = 0 到 n,
n
是日期数...
3.1 在sm
和sm + 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 函数