Как преобразовать время EPOCH во время и дату на Arduino?

У меня вопрос о том, как преобразовать временные метки EPOCH, которые я получаю в виде char*, в форматы ДД.ММ.ГГГГ и ЧЧ:ММ:СС отдельно?

Вот дополнительная информация о моем проекте Arduino: Arduino получает через модуль ESP8266 три разные временные метки EPOCH от API OpenWeatherMap для восхода, заката и текущей даты. Я хочу, чтобы эти три части информации отображались на экране размером 1,3 дюйма. OLED-дисплей, дата в формате ДД.ММ.ГГГГ и две другие метки времени в формате ЧЧ:ММ.

Я искал решение в нескольких библиотеках времени, таких как TimeLib и RTC, но не смог его найти.

Это мой фрагмент кода для получения временных меток:

DynamicJsonBuffer jsonBuffer(4096);
JsonObject& root = jsonBuffer.parseObject(client);

const char* date = root["dt"];
const char* sunrise = root["sys"]["sunrise"];
const char* sunset = root["sys"]["sunset"];

Как конвертировать эти временные метки?

, 👍4


2 ответа


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

3

Эпоха — это секунды от 1 января 1970 года. Получите его из JSON как беззнаковый длинный. Это числа в возвращаемом JSON (без ")

из https://openweathermap.org/ документа:

"sys":{"country":"JP","sunrise":1369769524,"sunset":1369821049},


чтобы преобразовать его в строку с помощью TimeLib.h:

#include <TimeLib.h>
#include <ArduinoJson.h>

void setup() {

  Serial.begin(115200);

  const char* json = "{\"country\":\"JP\",\"sunrise\":1369769524,\"sunset\":1369821049}";

  DynamicJsonBuffer jsonBuffer;
  JsonObject& root = jsonBuffer.parseObject(json);

  unsigned long t = root["sunrise"];

  char buff[32];
  sprintf(buff, "%02d.%02d.%02d %02d:%02d:%02d", day(t), month(t), year(t), hour(t), minute(t), second(t));

  Serial.println(buff);
}

void loop() {
}
,

Обратите внимание, что вам может потребоваться разделить метку времени на 1000, если она включает мс, как, например, в JS Dates., @dandavis

@dandavis, я взял образец JSON с сайта openweathermap, @Juraj

Конечно, я просто указываю на то, что в целом существует две «эпохи», о которых следует знать при использовании веб-сервисов., @dandavis

Для этого примера не обязательно делить на 1000. Большое спасибо за помощь :), @imax10000

@Juraj, у меня есть еще один вопрос по этой теме: может ли TimeLib также преобразовывать временные метки EPOCH в названия дней? (понедельник и т. д.), @imax10000

dayStr(день недели(t)); или dayShortStr http://playground.arduino.cc/code/time, @Juraj


0

У меня возникла аналогичная проблема с моей собственной библиотекой Wi-Fi m_wifi..cpp для ESP32 ( см. здесь )

После прочтения и поиска в Google я написал следующее решение:

ESP32Time rtc(0);
long int epochTime;
...

rtc.setTime( epochTime  );
Serial.println( rtc.getDateTime(true) );
,

можно ли его использовать на Arduino, отличном от esp32, как в вопросе?, @Juraj

да. вы можете скопировать код для использования не на ESP32. Просто нужно найти совместимую библиотеку для вашего конкретного MCU., @Miguel Silva