我有一个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',所以它不会从数组中获取值。
如何使代码每隔一小时循环回来并确切地说是小时的一半? 或者有更好的方法来实现我的需求吗?
答案 0 :(得分:0)
也许您可以使用DateTime,DateInterval和DatePeriod。
您可以创建$ 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...