Цитата(yarunt @ Feb 21 2013, 13:33)

Код
/* Leap year? adjust February */
if (year%400 == 0 || (year%4 == 0 && year%100 !=0)) {
;
} else {
if (t->month > 1) {
// result--; //непонятная компенсация
}
}
Компенсация-то понятная - чуть выше мы складываем число дней во всех месяцах меньше текущего, и в массиве числа дней для февраля значится 29. Следовательно, если год не високосный, то надо вычесть один день. А бага простая - мы начинаем вычитать день не с марта, а уже с февраля, хотя тот самый 29-й день еще не наступил.
Исправить багу просто:
Код
if (t->month > 2) { // 2 - это февраль, а корректировать надо начиная с марта
result--;
}
Кстати, небольшой оффтопик: лично мне кажется, что часы в F2/F4 сильно испортили по сравнению с F1.
В F1 время хранилось в виде числа секунд, и совершенно простейшим образом тикало, сравнивалось, складывалось и вычиталось.
И можно было в низкоуровневом коде вообще забить на все часовые пояса, летнее/зимнее время, leap seconds и все такое прочее, а вводить эти сложности уже на самом верхнем уровне, непосредственно при печати времени для человека, где и думать, в каком виде человек хочет это время увидеть.
В F4 же теперь приходится хранить в человекочитаемом виде, а для всех операций конвертировать в нормальное 32-битное.
Опять же, например, я совершенно не верю ST-шной железной реализации правильных коррекций времени. Ну вот ни на грамм не верю, что они в момент June 30, 2012 23:59:60 UTC выдавали правильное время, а не на секунду позже, 1 июля 00:00:00

А иногда это важно.