Помнится, вопрос расчета времени по календарю не такой и простой как в приведенных формулах, помнится даже CTime от микрософт не всегда качественно справлялся с этой задачей. Если вопрос принципиален могу покапаться в архивах и привести парочку вариантов возникновения ошибки в реальных приложениях где производится расчет промежутка времени.
вот например
Код
CDate::CDate(const SYSTEMTIME &st)
{
/* Так как бывает летнее и зимнее время, возьмем
за базу полдень. Что бы перевод времени не влиял
на дату. То есть, если за базу берется полночь
переход на летнее время после зимнего может произвести
при вычислении BackDay() пропуск целой даты.
*/
CTime t( st.wYear, st.wMonth, st.wDay, 12, 0, 0 );
m_time = t;
}