Не удалось преобразовать 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
... )
@Guy . D, 👍0
Обсуждение1 ответ
Лучший ответ:
замена gmtime(&timeinfo)
на localtime(&timeinfo)
в myIOT32::convEpoch
передает определение часового пояса как нужно.
для получения дополнительной информации на этом сайте cpluspls
- Документация ESP32 для "time.h"
- ESP32 секунды от эпохи
- Установить время настенных часов или изменить смещение GMT без ntp-сервера?
- Как установить RTC в ES32 с помощью NTP-сервера?
- Ошибка при передаче `time_t` и `struct tm`, ESP32
- Обратная связь ESP32 от NTP
- (Почему) успешное завершение getLocalTime() на ESP32 занимает несколько секунд
- Размер структуры tm (datetime) отличается в ESP32 от linux64x
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