cal: Berechnung eines Kalenders

Hintergrund

Ein Klassiker der UNIX-Welt ist das Hilfsprogramm cal. Es gibt einen Kalender in Textform auf die Konsole aus. Ich habe mich beim Nachbau an der BSD-Implementierung orientiert, die u. a. auch in den meisten Linux-Distributionen gefunden werden kann.

cal gibt Kalender für die Jahre 1 bis 9999 aus. Dabei muß also der Umstieg vom julianischen Kalender auf den gregorianischen Kalender berücksichtigt werden. Dieser Umstieg erfolgte nicht überall zur gleichen Zeit. Offiziell eingeführt wurde der gregorianische Kalender im Jahr 1582 durch Papst Gregor XIII. Viele Länder, darunter Frankreich, Spanien, und natürlich das Heilige Römische Reich, nahmen ihn gleich auf. Andere Länder ließen sich mehr Zeit. England und seine Kolonien übernahm den gregorianischen Kalender im Jahr 1752, Russland sogar erst 1918. Ein entscheidender Unterschied zwischen den Kalendern ist die Regel, nach der Schaltjahre bestimmt werden. Dadurch bedingt ist auch der Versatz zwischen beiden Kalendern. Als in England der gregorianische Kalender übernommen wurde, mussten 11 Tage übersprungen werden. Man entschied sich dazu, diese dem September zu entnehmen: auf den 2. September 1752 folgte der 14. September.

Implementierung

Eine Schwierigkeit bei der Berechnung eines Kalenders stellt die Bestimmung der Wochentage dar. Für den gregorianischen Kalender verwende ich die Wochentagsformel von Carl Friedrich Gauß. Diese nutzt eine Tabelle mit Werten für jeden Monat. Davon ausgehend wird der Wochentag des gewünschten Tags bestimmt, und die verschiebende Wirkung der Jahre und Schaltjahre berücksichtigt. Für den julianischen Kalender habe ich eine eigene Formel entwickelt, die so ähnlich arbeitet, aber eine an anderer Stelle im Programm bereits vorhandene Tabelle nutzt.

Ich hatte cal das erste Mal im Juli 2003 implementiert. Drei Jahre später hat mich jemand auf eine falsche Schaltjahresberechnung hingewiesen. Weitere vier Jahre später habe ich das Programm noch mal neu implementiert. Bei dieser Neuimplementierung benutze ich einen Puffer für die Ausgabe, auf den ich beliebig zugreifen kann. Dadurch sind viele Schleifen zur Berechnung schöner geworden, weil ich nicht mehr so eng an das Darstellungsformat (Zeile für Zeile) gebunden bin. "Leider" kam ich nicht selbst auf diese Idee (ein Besucher meiner Webseite schlug sie vor), aber sie hat einen wertvollen Aha-Moment ausgelöst. Außerdem habe ich bei der Neuimplementierung einen automatisierten Test (Vergleich der Ausgabe gegen ein "echtes" cal) aufgesetzt, um keine neuen Fehler einzubringen.

Downloads

Datum Version Datei Beschreibung
2010-08-07 2.1 cal-2.1.win32.zip Binaries für Win32
cal-2.1.src.zip Quellcode

Zurück zur Hauptseite