… Eben hatte ich nicht schlecht geschaut, als es in meinem Kalenderprojekt keinen 26.03.2006 mehr gab, welcher vor ein paar Stunden aber noch vorhanden war. Dies brachte natürlich alle darauf folgenden Tage um eins durch einander und verwirrte mich doch etwas, da ich keinen Fehler an den betreffenden Quellcodestellen finden konnte und er nur in der Stunde von 23:00 Uhr auftrat.
Für mein Projekt hatte ich die aktuelle Zeit, welche ich als Ausgangspunkt für zukünftige und vergange Tage benutzte, wie folgt ausgelesen:
// get timestamp from now (today)
time_t t_today;
time (&t_today);
// set today's tm structur
tm *tm_today;
tm_today = localtime (&t_today);
Mein Fehler war die Nichtbeachtung der Umstellung der Sommerzeit, welche natürlich genau am 26.03.2006 statt findet. Ich hatte einfach angenommen, dass ein Tag immer 86400 Sekunden hat. Das bedeutete für mein Programm, es wird aus heutiger Sicht keinen 26.03.2006 23:00 Uhr geben, da die Uhrzeit an diesem Tag ja um eine Stunde vorgestellt wird und der Tag um 3600 Sekunden kürzer ist und es somit schon der 27.03.2006 00:00 wäre. Ebenso fehlerhaft würde die Zeitumstellung im Oktober sich mit einem doppelten Tag bemerkbar machen, da es statt 00:15 Uhr, doch erst 23:15 Uhr wäre.
Eine einfache aber wirkungsvolle Lösung war das manuelle Setzen des Zeitstempels vom aktuellen Tag auf 12:00 Uhr Mittags, womit ich die kritischen Zeitabschnitte umgehen konnte:
// get timestamp from now (today)
time_t t_today;
time (&t_today);
// set today's tm structur
tm *tm_today;
tm_today = localtime (&t_today);
// set today's tm structur time to 12:00:00,
// because summer time
// fix the problem with 23:00-23:59 and 00:00-00:59
tm_today->tm_hour = 12;
tm_today->tm_min = 0;
tm_today->tm_sec = 0;
Danke an die Engel für den zündenden Tipp und wieder was gelernt