У меня есть коллекция объектов с полем времени с временным шагом 30 минут:
Я просматриваю свой список на предмет дыр в данных, то есть в этом списке он должен вернуть:
dataHoleStart: 2020-03-29 04:30
dataHoleEnd : 2020-03-29 08:30
Дело в том, что 29 числа этого года у меня возникает проблема, потому что это день, когда мы меняем летнее время.
There is no hole:2020-03-29 01:00
There is no hole:2020-03-29 01:30
There is no hole:2020-03-29 03:00
There is no hole:2020-03-29 03:30
New hole: 2020-03-29 03:00
Existing hole: 2020-03-29 03:30
Existing hole: 2020-03-29 04:00
Existing hole: 2020-03-29 04:30
Existing hole: 2020-03-29 05:00
Но, заглянув в свою базу данных Postgres, я вижу, что данные довольно регулярные, нет никакой дыры.
Вот мой код:
foreach ($measures as $key => $measure) {
if ($key == 0) continue;
$nextTS = (clone $ts_cursor)->addMinutes(30);
if ($measure->time->eq($nextTS)) {
$ts_cursor = $nextTS;
echo "There is no hole:". $measure->time->format('yy-m-d H:i'). "<br/>";
continue;
}
// Here we have a hole.
if ($missingDataIni != null) {
// We are in an existing hole
$ts_cursor = $nextTS;
echo('Existing hole: ' .$measure->time->format('yy-m-d H:i'). "<br/>");
} else {
// We create a new hole
$missingDataIni = $nextTS;
$ts_cursor = $nextTS;
echo 'New hole: '.$measure->time->format('yy-m-d H:i'). "<br/>";
}
}
Я попытался преобразовать поля углерода в метку времени, но у меня все еще есть та же проблема.
Кроме того, в config/app.php
мой часовой пояс определен следующим образом:
'timezone' => 'Europe/Paris',
Как мне обрабатывать сравнение дат, включая летнее время, с Carbon
?
'timezone' => 'Europe/Paris',
в вашемconfig/app.php
- плохая идея. См. medium.com/@kylekatarnls/ Европа / Paris должен появиться, когда вы хотите отформатировать или обработать даты в конкретном контексте пользователя. В противном случае обрабатывайте время независимым образом, используя UTC. - person KyleK   schedule 25.08.2020->tz('Europe/Paris')
на экземпляре Carbon. - person KyleK   schedule 25.08.2020