Как преобразовать время 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"];
Как конвертировать эти временные метки?
@imax10000, 👍4
2 ответа
Лучший ответ:
Эпоха — это секунды от 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() {
}
У меня возникла аналогичная проблема с моей собственной библиотекой 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
- Как справиться с rollover millis()?
- Как получить текущее время и дату в Arduino без внешнего источника?
- Преобразование в Unix Timestamp и обратно
- Как запустить цикл на определенное время?
- Как преобразовать строку в массив байтов
- Почему мои часы реального времени показывают неверное время с моего ПК?
- Разница между «time_t» и «DateTime»
- Проблемы с преобразованием byte[] в String
Обратите внимание, что вам может потребоваться разделить метку времени на 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