如何获得最小间隔为 1 分钟的范围内的 X 个日期?
How can I get X dates in a range with a minimum interval of 1 minute?
我想根据给定的日期范围获取一些随机日期和时间值。
例如:开始日期:2015-04-29 08:00:00
和结束日期:2015-04-29 20:00:00
。
现在我想获取 15 个随机日期和时间值,并且它应该至少间隔 1 分钟。
我尝试了以下代码:
rand_date($min_date, $max_date,$total_number);
function rand_date($min_date, $max_date,$total_number)
{
$min_epoch = strtotime($min_date);
$max_epoch = strtotime($max_date);
for($i=0;$i<=$total_number;$i++)
{
$rand_epoch = rand($min_epoch, $max_epoch);
echo "in::".date('Y-m-d H:i:s', $rand_epoch)."\n\n";
}
}
当前输出:
in::2015-04-29 17:41:13 //<-
in::2015-04-29 17:41:15 //<-
in::2015-04-29 15:38:39
in::2015-04-29 17:41:50 //<-
in::2015-04-29 17:45:21
in::2015-04-29 11:50:57
in::2015-04-29 19:34:12
in::2015-04-29 14:05:55
in::2015-04-29 11:25:36
in::2015-04-29 15:46:53
in::2015-04-29 14:55:44
in::2015-04-29 19:53:30
in::2015-04-29 18:28:03
in::2015-04-29 08:52:13
in::2015-04-29 17:59:42
正如您在上面的结果中看到的那样,我突出显示了一些条目,其中只有基于秒的距离,但实际上我需要所有日期和时间值中至少有 1 分钟的距离。
如何让代码正常工作,以便每个 dateTimes 之间至少间隔 1 分钟?
这应该适合你:
这里我创建了一个 DatePeriod
with a DateInterval
of 1 minute. After this I loop through $period
and save the dates into an array. After this I shuffle()
the array and take an array_slice()
的 15 个元素。
<?php
$start = new DateTime("2015-04-29 08:00:00");
$interval = new DateInterval("PT1M");
$end = (new DateTime("2015-04-29 20:00:00"))->add($interval);
$period = new DatePeriod($start, $interval, $end);
foreach($period as $date)
$dates[] = $date->format("Y-m-d H:i:s");
shuffle($dates);
$result = array_slice($dates, 0 ,15);
print_r($result);
?>
可能的输出:
Array
(
[0] => 2015-04-29 09:37:00
[1] => 2015-04-29 14:41:00
[2] => 2015-04-29 18:30:00
[3] => 2015-04-29 15:37:00
[4] => 2015-04-29 17:37:00
[5] => 2015-04-29 09:18:00
[6] => 2015-04-29 08:18:00
[7] => 2015-04-29 10:39:00
[8] => 2015-04-29 14:15:00
[9] => 2015-04-29 13:45:00
[10] => 2015-04-29 13:06:00
[11] => 2015-04-29 10:04:00
[12] => 2015-04-29 18:24:00
[13] => 2015-04-29 13:47:00
[14] => 2015-04-29 18:15:00
)
编辑:
如果您不想要 1 分钟的静态间隔,但仍希望每个日期之间至少间隔 1 分钟,您可以使用此方法:
(这里我只是将间隔设置为1秒,然后以这种方式过滤数组,每个元素之间至少间隔1分钟)
<?php
$start = new DateTime("2015-04-29 08:00:00");
$interval = new DateInterval("PT1S");
$end = (new DateTime("2015-04-29 20:00:00"))->add($interval);
$period = new DatePeriod($start, $interval, $end);
foreach($period as $date)
$dates[] = $date->format("Y-m-d H:i:s");
shuffle($dates);
$pre = $start->getTimestamp();
$dates = array_filter($dates, function($v)use(&$pre){
if(abs(strtotime($v) - $pre) >= 60) {
$pre = strtotime($v);
return TRUE;
} else {
$pre = strtotime($v);
return FALSE;
}
});
$result = array_slice($dates, 0 ,15);
print_r($result);
?>
我想根据给定的日期范围获取一些随机日期和时间值。
例如:开始日期:2015-04-29 08:00:00
和结束日期:2015-04-29 20:00:00
。
现在我想获取 15 个随机日期和时间值,并且它应该至少间隔 1 分钟。
我尝试了以下代码:
rand_date($min_date, $max_date,$total_number);
function rand_date($min_date, $max_date,$total_number)
{
$min_epoch = strtotime($min_date);
$max_epoch = strtotime($max_date);
for($i=0;$i<=$total_number;$i++)
{
$rand_epoch = rand($min_epoch, $max_epoch);
echo "in::".date('Y-m-d H:i:s', $rand_epoch)."\n\n";
}
}
当前输出:
in::2015-04-29 17:41:13 //<-
in::2015-04-29 17:41:15 //<-
in::2015-04-29 15:38:39
in::2015-04-29 17:41:50 //<-
in::2015-04-29 17:45:21
in::2015-04-29 11:50:57
in::2015-04-29 19:34:12
in::2015-04-29 14:05:55
in::2015-04-29 11:25:36
in::2015-04-29 15:46:53
in::2015-04-29 14:55:44
in::2015-04-29 19:53:30
in::2015-04-29 18:28:03
in::2015-04-29 08:52:13
in::2015-04-29 17:59:42
正如您在上面的结果中看到的那样,我突出显示了一些条目,其中只有基于秒的距离,但实际上我需要所有日期和时间值中至少有 1 分钟的距离。
如何让代码正常工作,以便每个 dateTimes 之间至少间隔 1 分钟?
这应该适合你:
这里我创建了一个 DatePeriod
with a DateInterval
of 1 minute. After this I loop through $period
and save the dates into an array. After this I shuffle()
the array and take an array_slice()
的 15 个元素。
<?php
$start = new DateTime("2015-04-29 08:00:00");
$interval = new DateInterval("PT1M");
$end = (new DateTime("2015-04-29 20:00:00"))->add($interval);
$period = new DatePeriod($start, $interval, $end);
foreach($period as $date)
$dates[] = $date->format("Y-m-d H:i:s");
shuffle($dates);
$result = array_slice($dates, 0 ,15);
print_r($result);
?>
可能的输出:
Array
(
[0] => 2015-04-29 09:37:00
[1] => 2015-04-29 14:41:00
[2] => 2015-04-29 18:30:00
[3] => 2015-04-29 15:37:00
[4] => 2015-04-29 17:37:00
[5] => 2015-04-29 09:18:00
[6] => 2015-04-29 08:18:00
[7] => 2015-04-29 10:39:00
[8] => 2015-04-29 14:15:00
[9] => 2015-04-29 13:45:00
[10] => 2015-04-29 13:06:00
[11] => 2015-04-29 10:04:00
[12] => 2015-04-29 18:24:00
[13] => 2015-04-29 13:47:00
[14] => 2015-04-29 18:15:00
)
编辑:
如果您不想要 1 分钟的静态间隔,但仍希望每个日期之间至少间隔 1 分钟,您可以使用此方法:
(这里我只是将间隔设置为1秒,然后以这种方式过滤数组,每个元素之间至少间隔1分钟)
<?php
$start = new DateTime("2015-04-29 08:00:00");
$interval = new DateInterval("PT1S");
$end = (new DateTime("2015-04-29 20:00:00"))->add($interval);
$period = new DatePeriod($start, $interval, $end);
foreach($period as $date)
$dates[] = $date->format("Y-m-d H:i:s");
shuffle($dates);
$pre = $start->getTimestamp();
$dates = array_filter($dates, function($v)use(&$pre){
if(abs(strtotime($v) - $pre) >= 60) {
$pre = strtotime($v);
return TRUE;
} else {
$pre = strtotime($v);
return FALSE;
}
});
$result = array_slice($dates, 0 ,15);
print_r($result);
?>