#python #laravel #laravel-8
Вопрос:
Мне нужна помощь, чтобы решить проблему с переходом на летнее время.
Рабочий процесс приложения:
- Скрипт python считывает некоторые значения датчиков каждые 5 минут в esp32 (той же сети) и отправляет эти значения, добавляя «время действия» (данные и время, когда я читаю значения) в api laravel (размещенный) с помощью post methond, это добавит время синхронизации olso (данные и время, когда я записываю значения в БД).
- Laravel cronjob создает мне ежедневный отчет с максимальным минимальным средним значением от датчика
В будущем python всегда будет считывать значения каждые 5 минут, но будет хранить значения в локальной БД и синхронизировать значения каждые 30 минут, таким образом, я не потеряю значения из-за потери подключения к Интернету, я добавил «время синхронизации» просто для того, чтобы посмотреть, что и если это произойдет
Проблема работы cron:
Моя команда группирует все строки в базе данных по дням:
$weatherdata = rawData::all() -gt;groupBy(function (RawData $item) { return $item-gt;acktime-gt;format('Y-m-d'); }) -gt;each(function (Collection $day) { foreach ($day as $value){ Log::info($value); } Log::info('NEXT DAY'); });
И это, кажется, работает, но, читая журнал, я получаю эту проблему:
{"acktime":"2021-10-30T22:56:45.000000Z", NEXT DAY {"acktime":"2021-10-30T23:01:47.000000Z",
Для него в законное время рабочий день заканчивается на час раньше, и это не единственная проблема.
Если я сгруппирую строки по часам вместо дня:
NEXT HOUR {"acktime":"2021-10-31T02:02:54.000000Z","temperatur..."} ..other 23 values when hour is 2 (not ok,total is 24 values) NEXT HOUR {"acktime":"2021-10-31T03:03:58.000000Z","temperatur..."} ..other 11 values (it's ok,total should be maximum 12) NEXT HOUR
Это группирует меня в 2:00-3:00, как будто мы жили в то время всего один раз, но в реальности мы сделали 2:00-3:00 два раза..поэтому я ожидал:
NEXT HOUR {"acktime":"2021-10-31T02:02:54.000000Z","temperatur..."} ..other 11 value (it's ok,total 12) NEXT HOUR {"acktime":"2021-10-31T03:03:58.000000Z","temperatur..."} ..other 11 value (it's ok,total 12) NEXT HOUR {"acktime":"2021-10-31T02:02:54.000000Z","temperatur.."} ..other 11 value (it's ok,total 12)
Мой app.php устанавливается так, как должно быть:
'timezone' =gt; 'Europe/London',
My model class:
class rawData extends Model { use HasFactory; protected $fillable = [ 'acktime', 'temperature', 'humidity', ..other data.. 'synctime' ]; /** * The attributes that should be mutated to dates. * * @var array */ protected $dates = ['acktime','synctime']; public $timestamps = false; }
примечание: только вчера я добавил время действия и время синхронизации в качестве защищенных дат $
Скрипт на Python:
Скрипт python после считывания значения датчика напрямую отправляет значение в мой api, но, возможно, проблема в том, как я получаю время передачи данных на нем:
from datetime import datetime def writeData(data): data['acktime'] = datetime.now() http post
Конфигурация MySQL acktime и synctime относятся к типу данных, и по времени UTC 1 SHOW GLOBAL VARIABLES LIKE 'time_zone';
я получаю СИСТЕМУ Я не знаю, как получить часовой пояс, сохраненный в строках данных
Последний вопрос
Как я могу избежать этой проблемы в будущем?? Как я могу восстановить уже сохраненные значения времени данных??
Ответ №1:
Единственный способ, который я нашел, это определить время в формате UTC.
Время в формате UTC не зависит от времени экономии дневного времени, таким образом, у меня нет проблем с заказом.
Поэтому первым шагом было установить часовой пояс Лаварвеля в формате UTC:
конфигурацияgt;app.php
'timezone' =gt; 'UTC',
Это был хороший способ, но если вам нужно работать с Carbon::now (), вы должны напомнить, что now будет обслуживаться в часовом поясе сервера, поэтому вам нужно будет «UTC» по текущему времени!
Carbon::now('UTC')
Используя UTC в качестве базового времени, представьте еще одну «проблему», но у проблем есть решения:
Делая ежедневный отчет, я не могу напрямую использовать функции startOfDay() и endOfDay (), но мне нужно создать одну дату с моим местным часовым поясом, получить начало и конец дня, а затем преобразовать каждую в часовой пояс UTC:
$day = new Carbon($SingleDay); $day-gt;setTimezone('Europe/Rome'); $startTime = $day-gt;copy()-gt;startOfDay(); $endTime = $day-gt;copy()-gt;endOfDay(); $startTime-gt;setTimezone('UTC'); $endTime-gt;setTimezone('UTC');
И olso скрипта phyton изменяется, переназначая дату и время UtcNow для хранения данных
datetime.utcnow()
Для восстановления данных из базы данных я сделал запрос, удалив один или два часа в зависимости от дня, короткая работа, которая помогла мне восстановить все данные