Am 9. September 2001 wird ein interner Zeitzähler der Unix- und Windows-Systeme erstmals zehnstellig. Kein Problem - oder kommt jetzt erst der richtige Milleniums-GAU?
Wohl jedem Leser dürfte die Aufregung um das »Jahr 2000 Problem« noch in bester Erinnerung sein. Damals wurde befürchtet, dass es aufgrund von Computerprogrammen, die nur eine zweistellige Repräsentation der Jahreszahl verwenden, zu weltweiten Fehlfunktionen in der vom Computer abhängigen Infrastruktur kommen könnte. Zum Glück blieb der Supergau aus - sei es wegen der Überschätzung des Problems oder einfach wegen der guten Vorbereitung in sämtlichen Bereichen der Wirtschaft.
Weitgehend unbemerkt von der Öffentlichkeit bahnt sich allerdings ein weiterer »Überlauf« in Zusammenhang mit der Datumsverarbeitung in modernen Computern an: In Millionen von Programmen wird zur Ermittlung des momentanen Datums die Systemfunktion time() verwendet. Dies betrifft vor allem Software, die in C und C++ geschrieben ist und unter den Betriebssystemen Unix und Windows läuft. Die Funktion time() liefert die Anzahl der Sekunden zurück, die seit dem 1. Januar 1970 vergangen sind. Mit weiteren Funktionen, wie ctime() oder localtime(), kann der Programmier dann aus diesem Wert ein für den Menschen lesbares Datumsformat, wie »7. August 2001, 14:23:01« erzeugen.
Schauen wir uns doch einmal den momentanen Wert der time() Funktion an:
#include <time.h> #include <stdio.h> int main() { time_t t; time( &t); printf( "Momentaner Wert des Zeitzählers %d\n", t); return 0; }
Jetzt, wie gerade dieser Artikel verfasst wird, ist der Rückgabewert von time() gleich 997184673. Die beiden Neunen am Anfang lassen vermuten, dass der Wert 1000000000 nicht mehr lange auf sich warten lässt. Fügen wir doch noch folgende Zeilen in unser kleines Testprogramm ein:
t = 1000000000;
printf( "Der Zeitzähler wird zehnstellig am: %s\n", ctime(&t));
Die Ausgabe ist: Der Zeitzähler wird zehnstellig am: Sun Sep 09 03:46:40 2001
Wie man sieht, wird der Systemzeitzähler am Sonntag, den 9. September kurz vor vier Uhr MESZ, erstmals zehnstellig. Nun rechnen Computer allerdings nicht im Dezimal-, sondern im Hexadezimalsystem. Für den Computer ist dieser Übergang also nicht besonders bemerkenswert. Kritisch wird es nur dann, wenn sich ein Programmierer in der Vergangenheit dazu entschieden hat, diesen Wert in einem neunstelligen Datenbankfeld oder in einer neun Zeichen langen Zeichenkette zu speichern. In solchen Programmen wird es dann mit Sicherheit zu Problemen zu kommen. Wie schwerwiegend diese sein werden sowie wieviele und vor allem welche Programme von diesem Problem betroffen sind, ist unbekannt. Jedenfalls ist jeder mit der Entwicklung und Pflege von Software betraute Spezialist gut damit beraten, bei unerklärlichen Verhaltensweisen »seiner« Programme nach dem 9. September zunächst den hier beschriebenen Effekt ins Auge zu fassen.
Übrigens: Auch wenn Computer im Hexadezimalsystem rechnen - diese Zahlen können natürlich auch an Wertegrenzen stoßen. So ist der time_t Datentyp oft nichts anderes als ein signed long mit 4 Byte Länge. Wann dieser Wert endgültig an seine Grenzen stößt, lässt sich ebenfalls leicht feststellen:
t = 0x7fffffff;
printf( "Der Zeitzähler erreicht seinen Maximalwert am: %s\n", ctime(&t));
Auf meinem Computer ist die Ausgabe:
Der Zeitzähler erreicht seinen Maximalwert am: Tue Jan 19 04:14:07 2038
Nun, bis dahin ist ja noch ausreichend Zeit! Oder?