Не удалось преобразовать time_T из прошлого в структуру tm

В продолжение вопроса, заданного несколько дней назад, на который ответил Эдгар, возник новый вопрос:

Моя цель состояла в том, чтобы использовать значение pasted time_t и преобразовать его в переменную struct tm, чтобы использовать его, частично как Char для печати читаемого текста и некоторых логических запросов.

При запуске NTP настроен как:

void myIOT32::startNTP(const int gmtOffset_sec = 2 * 3600, const int daylightOffset_sec = 3600, const char *ntpServer = "pool.ntp.org")
{
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
}

и каждый раз, когда мне нужно получить эпоху и/или struct tm текущего времени, я вызываю эту функцию

void myIOT32::getTime()
{
  int a = 0;
  while (a < 3)
  {
    if (getLocalTime(&timeinfo))
    {
      delay(100);
      time(&epoch_time);
    }
    a++;
  }

НО, при использовании следующей функции я не получаю ссылку GMT (+3) по мере необходимости:

struct tm *myIOT32::convEpoch(time_t in_time)
{
  struct tm *convTime = gmtime(&in_time);
  //char time_char[40];
  //sprintf(time_char, "%04d-%02d-%02d %02d:%02d:%02d", convTime->tm_year + 1900, convTime->tm_mon + 1, convTime->tm_mday,
          convTime->tm_hour, convTime->tm_min, convTime->tm_sec);
  return convTime;
}

Это означает, что я получаю правильное время эпохи, но strcut tm на 3 часа раньше (и нет, я не хочу жестко кодировать +3... )

, 👍0

Обсуждение

Arduino и NTP-сервер не знают, в каком часовом поясе вы находитесь. Поэтому создайте константу и поместите ее в начало вашего скетча (да, хардкод). почему вы используете библиотеку времени C? TimeLib намного проще в использовании, @Juraj

@Juraj - даже сложно, это была конфигурация в начале, когда выполнялся start NTP?, @Guy . D

@Juraj, и причина, по которой я не хочу жестко кодировать +3, заключается в переходе на летнее время ..., @Guy . D

в Европе похоже, что у нас есть только несколько изменений на летнее/зимнее время. дату можно вычислить. https://github.com/jandrassy/Regulator/blob/104421279aef672362bcff0baf7447410bc2b590/Regulator/Modbus.ino#L94, @Juraj

@Juraj Да ... это был мой запасной вариант. Кстати, вы спросили о причине, по которой не используется TimeLib... поскольку в примере под названием «simpleTime» для ESP32 даты использовались таким образом (а не как в ESP8266), поэтому я предположил, что это проблема совместимости., @Guy . D


1 ответ


Лучший ответ:

0

замена gmtime(&timeinfo) на localtime(&timeinfo) в myIOT32::convEpoch передает определение часового пояса как нужно.

для получения дополнительной информации на этом сайте cpluspls

,