主要问题是由将$uptime[] 定义为值数组引起的,导致$epoch = $uptime 包含时间戳字符串数组。当 DateTime() 需要单个 string 值时。
要解决此问题,您需要将 DateTime 调用移动到 foreach 迭代中。
正如 Martin 提供的答案中提到的,另一个问题是您没有在代码中处理异常。如果uptime 或last_seen 不是提供给DateTime 构造函数的预期值,则会引发异常。
要处理异常,您可以使用try/catch 块来处理代码中出现的问题。异常旨在指出您代码中的致命错误,以便您可以通过编程方式解决或验证它们,通常不应使用try/catch 忽略它们。更多详情请查看https://www.php.net/manual/en/language.exceptions.php
不知道你想用你的代码完成什么。看来您想要echo 和return 所有来自$ligowave->result 的值。我在下面进行了适当的更改,以反映我猜你的意图。以及一些小的简化。
请澄清您想要return 和echo 的内容,我会调整答案。
//...
// getting controller ap info //
$values = [];
foreach ($ligowave->result as $index => $obj) {
//convert the unix timestamps to DateTime objects
$uptime = (new DateTime('@' . $obj->uptime));
$last_seen = (new DateTime('@' . $obj->last_seen))->setTimeZone(new DateTimeZone('Europe/Amsterdam'));
//store the return values into an array
$values[] = $value = [
'name' => $obj->name,
'status' => $obj->status,
'uptimetime' => $uptime->format('H:i:s'),
'lastseendate' => $last_seen->format('d-m-Y H:i:s')
];
//output each of the statuses
printf('%s is %s, ', $obj->name, $obj->status);
if ('up' === $obj->status) {
echo 'uptime is: ' . $value['uptimetime'];
} else {
echo 'device is last seen: ' . $value['lastseendate'];
}
}
return $values;
}
结果:
foo is up, uptime is: 10:20:54
bar is down, device is last seen: 01-06-2019 08:22:30
返回:
array (
0 =>
array (
'name' => 'foo',
'status' => 'up',
'uptimetime' => '10:20:54',
'lastseendate' => '05-06-2019 11:16:21',
),
1 =>
array (
'name' => 'bar',
'status' => 'down',
'uptimetime' => '10:20:54',
'lastseendate' => '01-06-2019 08:22:30',
),
)
您似乎还使用 24 小时时间来表示持续时间。
如果是这样,您将需要使用DateInterval 而不是DateTime,通过在适当的时间范围内使用DateTime::diff。更多详情请查看https://php.net/manual/en/class.dateinterval.php
假设uptime 是开始时间,last_seen 是当前运行时间,您可以使用$uptime->diff($last_seen) 来检索uptime 到last_seen(持续时间)之间经过的时间,而不是 24 uptime 的小时时间值。否则,您可以使用$uptime->diff(new DateTime('now', new DateTimeZone('Europe/Amsterdam'))) 来使用当前日期时间。
需要注意的是,DateInterval 的小时数是不可累积的,这意味着您需要以某种方式添加天数。我使用了最准确的%a,而不是使用days * 24 增加时间
//...
$uptime = (new DateTime('@' . $obj->uptime))->setTimeZone(new DateTimeZone('Europe/Amsterdam'));
$last_seen = (new DateTime('@' . $obj->last_seen))->setTimeZone(new DateTimeZone('Europe/Amsterdam'));
$values[] = $value = [
'name' => $obj->name,
'status' => $obj->status,
'lastseendate' => $last_seen->format('d-m-Y H:i:s'),
'uptimetime' => $uptime->diff($last_seen)->format('%a.%H:%I:%S'), //DD.HH:MM:SS
];
//...
结果:
foo is up, uptime is: 12.22:48:26