Старнности библиотеки Sodaq_DS3231
- Войдите на сайт для отправки комментариев
Втр, 17/07/2018 - 15:04
Добрый день!
Смотрю исходники библиотеки, чтобы понимать, как она работает. В файле Sodaq_DS3231.cpp есть функция с названием date2days. Вот так выглядит:
// number of days since 2000/01/01, valid for 2001..2099 static uint16_t date2days(uint16_t y, uint8_t m, uint8_t d) { if (y >= 2000) y -= 2000; uint16_t days = d; for (uint8_t i = 1; i < m; ++i) days += pgm_read_byte(daysInMonth + i - 1); if (m > 2 && y % 4 == 0) ++days; return days + 365 * y + (y + 3) / 4 - 1; }
Вот выражение которое они вычисляют в return выглядит для меня как магия. Эта часть значения логична days + 365 * y, а вот зачем это не понимаю (y + 3) / 4 - 1. У вас есть идеи?
високосный год
Upd: не, високосный год выше.
посчитал руками, че то не так с формулой,
вот так должна выглядить
days + 365 * y - (y + 3) / 4 - 1;
вот так должна выглядить
days + 365 * y - (y + 3) / 4 - 1;
Не должна. Подставьте 01.01.2001. Что получите?
1 + 365 - 4/4 - 1 = 364
да, был не прав, некорректно посчитал
lebfr, что там за формула Вам уже ответили, что же касается самой функции, то она, мягко скажем, не очень. Её писали похоже, по принципу "и так сойдёт".
Ответ получен. Про высокосный год у меня вообще в голове не всплыло. Спасибо всем.