Основная проблема вызвана определением $uptime[]
как массива значений, в результате чего $epoch = $uptime
содержит массив строк меток времени.Когда DateTime()
ожидает единственное значение string
.
Для решения проблемы необходимо переместить вызовы DateTime
внутри итерации foreach
.
Другая проблема, какв ответе Мартина упоминается, что вы не обрабатываете исключения в своем коде.Если 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