在精确的时间内向后循环

时间:2015-11-17 11:15:02

标签: php loops time cron

我有一个cron脚本,每30分钟检查另一个应用程序的状态,(同步到:完全按小时和半小时)。如果状态中有CHANGE(1或0),则会在数据库中记录新状态和日期和时间。 我现在正试图显示“过去48小时内的状态”条形图。

由于数据库只记录CHANGE的状态,我不能直接将这些数据与图表一起使用,因为这不会给我过去48小时内每半小时的状态。相反,我决定将每个数据库结果放入一个关联数组('12 / 11/15 - 13:00'=>'1','12/12/15 - 22:30'=>'0')然后使用循环向后循环30分钟48小时(所以96次)并检查数组中是否存在该值的值;如果是,则回显该值,否则回显前一个值。

for ($i=-96; $i <= 0; $i++) {
    $n = $i * 30;
    $d_amount = $n." mins, - 1 month";
    $d_minus = strtotime($d_amount);
    $d1 = date('j/n - h', $d_minus)."h : ".date('i', $d_minus)."m";
    if (isset($chart_availabilityA[$d1])) {
        echo "['".$d1."', ".$chart_availabilityA[$d1]."],";
        $prev_value = $chart_availabilityA[$d1];
    } else {
        echo "['".$d1."', ".$prev_value."],";
    }
 }

我的问题是:原始脚本完全在小时和半小时运行,但此代码段仅在脚本运行时计算半小时,例如'12 / 11/15 - 13:07'=&gt; '1','12 / 11/15 - 13:37'=&gt; '0',所以它不会从数组中获取值。

如何使代码每隔一小时循环回来并确切地说是小时的一半? 或者有更好的方法来实现我的需求吗?

1 个答案:

答案 0 :(得分:0)

也许您可以使用DateTimeDateIntervalDatePeriod

您可以创建$ start DateTime和$ end DateTime。对于$ start,您可以使用setTime方法设置所需时间。 在此示例中,您可以将时间设置为30分钟或0分钟以匹配您的条件(对于每个确切的小时和精确的小时的一半)。 从那一刻起,回到48小时。然后创建一个30分钟的$ dateInterval。然后创建一个$ datePeriod,您可以使用foreach循环,在此示例中将执行97次(包括开始日期)。

如果您想省略开始日期,可以使用:

$datePeriod = new DatePeriod($start, $dateInterval, $end, DatePeriod::EXCLUDE_START_DATE);

例如,使用您的日期'12 / 11/15 - 13:07'作为开始日期:

$start = DateTime::createFromFormat('m/d/y - H:i', '12/11/15 - 13:07');
$start
    ->setTime(
        $start->format('H'),
        $start->format('i') > 30 ? 30 : 0
    )
    ->modify('-48 hours');

$end = DateTime::createFromFormat('m/d/y - H:i', '12/11/15 - 13:07');
$dates = array();
$dateInterval = new DateInterval('PT30M');
$datePeriod = new DatePeriod($start, $dateInterval, $end);

foreach($datePeriod as $date) {
    $d1 = $date->format('m/d/y - H:i');
    array_unshift($dates, $d1);
}

var_dump($dates);

将导致:

array(97) {
  [0]=>
  string(16) "12/11/15 - 13:00"
  [1]=>
  string(16) "12/11/15 - 12:30"
  [2]=>
  string(16) "12/11/15 - 12:00"
etc...

Demo