Jahr 2000 Problem
Inhalt
- Über die Zeit - was läuft hier falsch?
- Lösungen
- Das Jahr 2000 Problem und wie die DateLib (TM) helfen kann
- Links
Über die Zeit - was läuft hier falsch?
Wie man fast überall lesen kann, gibt es ein Problem beim Erreichen des Jahres 2000 mit der korrekten Datumsberechnung.
Das Hauptproblem besteht darin, daß Programmierer meistens nur die letzten zwei Ziffern eines Jahres verwendeten, nicht aber das Jahrhundert. Die Gründe hierfür sind, daß eine zweistellige Jahresangabe kürzer zu schreiben ist, wobei wir Menschen auch selten älter als 100 Jahre werden und deshalb nur mit Datumsangaben über einen kleineren, für uns überschaubaren Zeitraum arbeiten.
Die meisten Programme können 00 als Jahresangabe nicht korrekt handhaben. Gründe hierfür sind z.B. das 00 nicht als Eingabe angenommen wird, oder daß 00 als 1900 interpretiert wird. Wie auch immer handelt es sich hier nur um ein kleines Problem, denn die Frage ist, wie die Algorithmen hinter den Eingabefeldern arbeiten.
Es könnte sein, daß diese Algorithmen nur für den Zeitraum von 1900 bis 1999 korrekt arbeiten. Bekannter Kalendersoftware ist zu entnehmen, daß diese Algorithmen oftmals auf den Zeitraum 1900 bis 2100 funktionieren. Denn hierbei handelt es sich um einen sehr speziellen Zeitraum der sehr einfach zu berechnen ist. Um größere Zeiträume behandeln zu können, muß man mit astronomischen Phänomenen von Erde, Sonne und Mond vertraut sein. Die Probleme, welche im Jahr 2000 auftreten werden, entstehen nicht nur, weil Eingabefelder nur zwei Ziffern akzeptieren. Bei der Datumsberechnung handelt es sich um ein Spezialgebiet, welches nicht jedermanns Sache ist. Im Jahre 1582 führte Papst Gregor XIII die sogenannte 'Gregorianische Kalenderreform' durch, um die Abweichung zwischen Monaten und Jahreszeiten zu beheben. Um diese Korrektur durchzuführen wurden von ihm die 10 Tage - vom 5 Oktober 1582 bis zum 14 Oktober 1582 - aus dem Kalender entfernt. Das Problem besteht nun darin, daß diese Reform zu verschiedenen Zeiten in verschiedenen Staaten/Ländern durchgeführt wurde.
Kommen wir nun zurück zum Jahr 2000 Problem. Der 01.01.1900 war ein Montag, wohingegen der 01.01.2000 ein Samstag ist. Wie man sehen kann, können auch hierdurch die Programme verwirrt werden. Wenn ein Programm denkt, daß 00 das Jahr 1900 meint, werden somit alle Wochentage des Jahres falsch berechnet. Hierdurch entsteht ein Chaos!
Ein weiterer Aspekt des Jahres 2000 ist, daß die Gregorianische Kalenderreform den Algorithmus zur Schaltjahresberechnung derart definiert, daß sich die Monate nicht wieder gegen die Jahreszeiten verschieben. Um herauszufinden, ob ein Jahr ein Schaltjahr ist, gibt es die folgenden drei Regeln:
- Jedes Jahr, das durch 4 teilbar ist, ist ein Schaltjahr
Beispiel: 1996 ist ein Schaltjahr - Jedes Jahr, das durch 100 teilbar ist, ist kein Schaltjahr
Beispiel: 1900 ist kein Schaltjahr - Jedes Jahr, das durch 400 teilbar ist, ist wieder ein Schaltjahr
Beispiel: 2000 wird ein Schaltjahr sein
Wie man sehen kann, besteht ein weiterer Unterschied zwischen den Jahren 1900 und 2000 darin, daß 2000 ein Schaltjahr ist, wohingegen 1900 keines war. Übrigens wurde der Schaltjahresalgorithmus sehr oft falsch beschrieben - zum Beispiel ist in den Internet RFC's 1095 und 1189 die folgende falsche Algorithmusbeschreibung zu lesen:
In the Gregorian calendar, all years have 365 days except those divisible by 4 and not by 400, which have 366.
Im gregorianischen Kalender haben alle Jahre 365 Tage, ausgenommen die, welche durch 4 teilbar sind und nicht durch 400 - diese haben 366 Tage.
Die 4 Jahresregel ist hier korrekt, die 100 Jahresregel wurde vergessen - und die 400 Jahresregel falsch verwendet!
Alle diese Probleme sind sehr grundlegend. Wenn sie nicht korrekt berechnet werden, werden andere Dinge ebenfalls fehlerhaft berechnet - wie z.B.:
- Berechnung der Differenz zwischen zwei Daten
- Berechnung von Ostern und allen abhängigen Feiertagen
- Berechnung der Mondphasen
Das Jahr 2000 Problem wird in den Jahren 2038, 2078, 2100, ... wiederkehren, in Abhängigkeit von verschiedenen Betriebssystemen wie Unix und der jeweiligen Implementierung der Kalenderalgorithmen. Vielleicht denke Sie, daß 2038 weit weg ist - aber haben die Leute die 1960 Software entwickelten das nicht auch über 2000 gedacht?
Lösungen
Nun wollen wir mögliche Lösungen beschreiben, um Software sicher und benutzbar für das Jahr 2000 und darüber hinaus zu machen.
Seien Sie bitte vorsichtig bei der Suche nach einer Lösung für das Jahr 2000 Problem. Es gibt einige Leute, die versuchen das Problem schnell und unvollständig zu lösen, um schnell und einfach Geld zu verdienen. Zum Beispiel sollten Sie niemandem trauen, der vom 'Jahrtausendfehler' spricht, denn so Jemand weiß nicht worüber er spricht. Das nächste Jahrtausend beginnt zu Ihrer Information am 01.01.2001 und NICHT am 01.01.2000.
Es gibt zwei Probleme, die zu behandeln sind:
- Gehen Sie sicher, daß Ihre Kalenderalgorithmen korrekt sind.
- Behandeln Sie Eingaben von zwei stelligen Jahreszahlen korrekt.
Für das erste Problem gibt es eine sehr einfache und mächtige Lösung. Sie können die DateLib (TM) lizensieren. Diese Bibliothek erlaubt Ihnen Kalenderberechnungen vom Jahr 8 bis zum Jahr 8000 durchzuführen. Sie werden sicher schnell merken, daß durch diese Bibliothek Ihre Software sicher wird für die nächsten Jahrhunderte!
Falls Sie daran denken Ihre eigene Bibliothek für Datumsberechnungen zu entwickeln, lassen Sie mich bitte darauf hinweisen, daß dies sehr aufwendig und kostspielig ist (ca. US$ 150.000).
Nun zum zweiten Problem, der Handhabung von zweistelligen Jahreszahlen:
Dieses kann in zwei Fälle unterschieden werden:
- Die Umgebung in der Ihre Software arbeitet - unterstützt Jahreszahlen mit 4 Ziffern komplett.
- Die Umgebung in der Ihre Software arbeitet - unterstützt nur zweistellige (2) Jahreszahlen.
Im ersten Fall ist die Umwandlung einer zweistelligen Jahreszahl in eine vierstellige sehr einfach. Sie müssen nur das Betriebssystem nach der aktuellen (4 stelligen) Jahreszahl fragen. Nun können Sie das für die 2 stellige Jahreszahl zu ergänzende Jahrhundert mittels der 'Sliding Window Technik', welche weiter unten beschrieben wird, ergänzen.
Der zweite Fall kann nur mit Hilfe des Benutzers oder möglicherweise mittels eines vordefinierten Jahres gelöst werden:
Stellen Sie sich die Zeit als eine endlose Linie vor. Über diese Zeitlinie bewegt sich nun ein Fenster das 100 Jahre umfaßt. In der Mitte des Fensters ist das aktuelle Jahr. Vor diesem befinden sich die letzten 49 Jahre, und auf das aktuelle Jahr folgen die zukünftigen 50 Jahre. Beim Erhöhen des aktuellen Jahres bewegt sich das Fenster in die Zukunft.
Nun benötigen Sie noch das aktuelle Jahr, oder ein Jahr, welches sehr nahe bei diesem liegt (wie z.B. das Jahr in dem Ihre Software veröffentlicht wurde). Wenn Ihre Software nun mit zweistelligen Jahreszahlen arbeitet, können Sie dies mittels des Fensters als Vergangenheit, Gegenwart oder Zukunft klassifizieren. Werden sehr oft zukünftige Jahre verwendet, können Sie das Fenster in die Zukunft bewegen, um es aktuell zu halten.
Gehen Sie sehr sorgfältig bei der Überarbeitung Ihrer alten oder neu zu entwickelnden Software vor, denn das Jahr 2000 Problem könnte wieder auftreten - spätestens im Jahre 2100 (und dann wird es vielleicht noch schwieriger zu beseitigen sein).
Das Jahr 2000 Problem und wie die DateLib (TM) helfen kann
Sollten Sie mit dem Jahr 2000 Problem konfrontiert sein (und wer ist das nicht), dann könnte dies einfacher zu lösen sein, wenn Sie die DateLib (TM) einsetzen. Diese Bibliothek stellt Funktionen für alle Arten von Datums- und Uhrzeitberechnungen zur Verfügung. Zum Beispiel dient die einfachste Funktion dazu, herauszufinden ob es sich bei einem Jahr um ein Schaltjahr handelt. Weitere Funktionen liefern den Wochentag eines Datums, prüfen die Gültigkeit eines Datums, vergleichen zwei Daten usw. Höhere Funktionen berechnen die Anzahl der Tage zwischen zwei Daten oder den Tag und Monat des Ostersonntages in einem Jahr.
Speziell für das Jahr 2000 Problem existiert eine, die das Jahrhundert für eine zweistellige Jahresangabe mittels der Sliding Window Technik ergänzt. Dies erlaubt Ihnen, Ihre Benutzungsschnittstellenelemente mit zweistelligen Jahreszahlen unverändert zu lassen.
Zu guter Letzt stellt die DateLib (TM) sehr mächtige Formatierer und Parser zum Erzeugen und parsen von Datums- und Uhrzeitstrings. Monats- und Wochentagsnamen können in 21 Sprachen gelesen und geschrieben werden. Der Datumsstringparser ist in der Lage, über 40 Datumsstringformate durch automatische Analyse zu erkennen, wobei es möglich ist eine unbeschränke Anzahl an Stringformaten durch die Verwendung von Templates zu erkennen.
Die DateLib (TM) wurde in ANSI-C/C++ geschrieben der auf jedem System funktionieren sollte, das über einen ANSI-C oder C++ Compiler verfügt. Das bedeutet, daß jede Software, welche in C, C++ oder einer Programmiersprache die ein Interface zu C oder C++ unterstützt, die Bibliothek verwenden kann. Weiterhin erlaubt jede Programmiersprache, die den Zugriff auf Shares Libraries (auch Dynamische Link Libraries genannt) unterstützt, den Einsatz der DateLib (TM) um das Jahr 2000 Problem zu beheben oder aber die Funktionalität der Datums- und Uhrzeitberechung zu erweitern.
Um alle diese mächtigen Features Verwenden zu können, welche Ihnen dabei helfen das Jahr 2000 Problem zu lösen, bleibt für Sie jedoch noch eine Sache zu tun: Sie müssen Ihren alten Programmcode, der für das Jahr-2000-Problem verantwortlich ist, identifizieren. Dies sollte jedoch ein sehr geringer Aufwand sein, verglichen mit der Funktionalität für korrekte Datumsberechnungen vom Jahr 8 bis 8000, die Ihnen die DateLib (TM) zur Verfügung stellt.