Старнности библиотеки Sodaq_DS3231

lebfr
Offline
Зарегистрирован: 18.06.2018

Добрый день!

Смотрю исходники библиотеки, чтобы понимать, как она работает. В файле 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.  У вас есть идеи?

andycat
andycat аватар
Онлайн
Зарегистрирован: 07.09.2017

високосный год

Upd: не, високосный год выше. 

посчитал руками, че то не так с формулой,

вот так должна выглядить

days + 365 * y - (y + 3) / 4 - 1;

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andycat пишет:

вот так должна выглядить

days + 365 * y - (y + 3) / 4 - 1;

Не должна. Подставьте 01.01.2001. Что получите?

1 + 365 - 4/4 - 1 = 364

 

andycat
andycat аватар
Онлайн
Зарегистрирован: 07.09.2017

да, был не прав, некорректно посчитал

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

lebfr, что там за формула Вам уже ответили, что же касается самой функции, то она, мягко скажем, не очень. Её писали похоже, по принципу "и так сойдёт".

lebfr
Offline
Зарегистрирован: 18.06.2018

Ответ получен. Про высокосный год у меня вообще в голове не всплыло. Спасибо всем.