DateTime из RTClib выдает неверные даты/время?
Часы реального времени работают нормально, но у меня возникли проблемы с классом DateTime. Судя по следующему тесту, похоже, его математические вычисления неверны.
#include <RTRlib.h>
void loop()
{
auto ts = TimeSpan(0, 8, 0, 0); // 8 hours
auto zero = DateTime(0, 0, 0, 0, 0, 0);
auto alarm = zero + ts;
Serial.println(String("Zero date: ")+zero.year()+" "+zero.month()+" "+zero.day()+" "+ zero.hour()+":"+zero.minute()+" "+zero.second());
Serial.println(String("Alarm as timespan: ")+ts.days()+"d "+ ts.hours()+":"+ts.minutes()+" "+ts.seconds());
Serial.println(String("Alarm date: ")+alarm.year()+" "+alarm.month()+" "+alarm.day()+" "+ alarm.hour()+":"+alarm.minute()+" "+alarm.second());
}
Мой вывод (повторяется):
Zero date: 2000 0 0 0:0 0
Alarm as timespan: 0d 8:0 0
Alarm date: 2043 4 30 1:31 44
Кроме того, при создании DateTime(0) я ожидал, что часы, минуты и секунды будут равны нулю. Это не так. Что не так с этой библиотекой и как она стала такой популярной, если она не работает?
@piojo, 👍0
1 ответ
Лучший ответ:
Вы испытываете последствия использования кода, не выполняющего проверку корректности. Библиотека допускает использование бессмысленных дат (помимо того, что она даёт нам всем новую ошибку, обратную Y2K, предполагающую только даты после 2000 года).
Когда вы создаете DateTime(0, 0, 0, 0, 0, 0);, вы говорите использовать месяц 0 и день 0. Они не имеют значения при вычислении дат, где всегда предполагается, что первый месяц — 1, а первый день — 1.
Остальной код библиотеки предполагает, что даты действительны, поэтому, если вы укажете недействительные даты, следует ожидать неожиданного поведения!
Если вы измените только назначение zero на DateTime(0, 1, 1, 0, 0, 0);, вы увидите более ожидаемое поведение.
- отображение 3-значного времени часов на 4-значном 7-сегментном дисплее
- Примените патч к библиотеке для пользовательских изменений в Arduino IDE.
- Библиотека RTClib вторая, вторая
- Преобразование в Unix Timestamp и обратно
- Как получить исходные файлы для библиотек Arduino?
- Ошибка: "недопустимое использование нестатической функции-члена" при вызове функции из моего собственного класса-метода
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Разница между «time_t» и «DateTime»