Еще один вопрос о переходе на летнее время в приложении с несколькими стеками

#python #laravel #laravel-8

Вопрос:

Мне нужна помощь, чтобы решить проблему с переходом на летнее время.

Рабочий процесс приложения:

  1. Скрипт python считывает некоторые значения датчиков каждые 5 минут в esp32 (той же сети) и отправляет эти значения, добавляя «время действия» (данные и время, когда я читаю значения) в api laravel (размещенный) с помощью post methond, это добавит время синхронизации olso (данные и время, когда я записываю значения в БД).
  2. 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()  

Для восстановления данных из базы данных я сделал запрос, удалив один или два часа в зависимости от дня, короткая работа, которая помогла мне восстановить все данные