Потому что в линуксе системное время (system time) идёт отдельно от аппаратных часов (hardware clock). При загрузке обычно системное время устанавливается согласно аппаратным часам (на PC читается из CMOS'а), но потом оно может идти само по себе, с использованием более точных средств отсчёта времени, чем стандартные часы. Изменение системного времени не приводит к автоматическому переводу аппаратных часов. Чтобы записать системное время в аппаратные часы, нужно сделать hwclock --systohc.
Ищи в Гугле. Я сам сейчас не вспомню, но когда обновлял 10.2 на 10.3, то где-то с какого-то бодуна вписывалась некая величина коррекции времени, которая задействовалась при каждом запуске.
У меня было такое, проблема была в том что /usr лежал на отдельном разделе. Установка timezone происходит до монтирования локальных фс и для этого нужны данные из директории /usr/share/zoneinfo. Красивого решения не нашел, просто положил /usr/share/zoneinfo в корневой раздел, тоесть держал 2 экземпляра этой директории на 2х разделах на root'овом и /usr.