Hessischer Bildungsserver / Arbeitsplattformen

Kalender

Wir nehmen das aktuell in den Medien diskutierte Jahr-2000-Problem zum Anlaß, uns mit Fragen der Kalenderberechnung auseinanderzusetzen und entwickeln ein Kalenderprogramm.

Der Prototyp eines Kalender ist mit Delphi schnell entworfen (Rapid-Prototyping). Wir benötigen für die Monate eine ComboBox-, für die Jahreszahl eine SpinEdit- und für die Tage eine StringGrid-Komponente.

Mit Hilfe der Delphi-1-Hilfe besorgt man sich Informationen über die Schlüsseleigenschaften der jeweiligen Komponente und nimmt im Objektinspektor alle Einstellungen vor, die zur Entwicklungszeit gemacht werden können. Einstellungen, die erst zur Laufzeit möglich sind, wie beispielsweise die Werte der Zellen Cells[Spalte,Zeile], kann man in die OnCreate-Methode des Formulars stecken.

Kennt man den Wochentag des Monatsersten und die Anzahl der Tage im Monat, so kann man den Kalender wie im Beispiel berechnen und ausgeben. Die Anzahl der Tage in den zwölf Monaten speichert man am einfachsten in einem Feld (Monatstage: ARRAY[1..12] of Integer;). Für den Monatsersten benutzt man:

Zeller's Wochentagsberechnung

Um den Wochentag eines bestimmten Datums zu bestimmen, berechnet man die Zahl:

Wochentag = (Tag + (13*Monat - 1) div 5 + Jahr + Jahr div 4 - Jahr div 100 + Jahr div 400) mod 7

Die Monatszählung beginnt mit Monat=1 für den März. Januar und Februar sind Monat 11 bzw. 12 des Vorjahres, der Schalttag wird also für eine einfachere Berechnung an das Jahresende gelegt. Als Wochentag ergibt sich 0 für einen Sonntag, 1 für einen Montag,..., 6 für einen Samstag.

Nach der DIN 1355 beginnt die Woche mit einem Montag, weswegen das Ergebnis der Zellerschen Wochentagsberechnung noch weiterverarbeitet werden muss, um im Monatskalender die Spaltenposition zu ergeben.

Zum Verständis der Zellerschen Formel muss man sich mit der Geschichte des Kalenders auseinander setzen.

Geschichte des Kalenders

Frühe Kulturen benutzten oft einen Mondkalender, weil sich der Mond gut beobachten läßt und der Mondzyklus relativ kurz ist. Seit der Einführung der Zeitrechnung basieren Kalender auf dem Sonnenumlauf, der 365.242199 Tage lang ist. Die alten Ägypter wußten, dass ein Jahr ungefähr 365 ¼ Tage dauert. Mit der Einführung des Julianischen Kalenders durch Julius Cäsar im Jahre 45 v. Chr. wurde daher die Jahreslänge auf 365 ¼ Tage festgelegt. Damit der Jahresanfang sich nicht im Laufe der Jahrhunderte in eine andere Jahreszeit verschiebt, wird alle vier Jahre im Februar ein Schalttag eingefügt. Die so festgelegte Jahreslänge unterscheidet sich von der tatsächlichen um 0,007801 Tage. In 1600 Jahren wächst dieser Unterschied auf rund 12 Tage an. Daher hat im Jahr 1582 Papst Gregor XIII den Gregorianischen Kalender eingeführt. Die zehn Tage zwischen dem 4. und 15. Oktober 1582 entfielen. Für den neuen Kalender wurde eine Jahreslänge von 365,2425 Tagen zugrunde gelegt. Daher ist eine andere Schaltjahrregelung nötig.

  1. Angenommen, wir legen dem Kalender eine Jahreslänge von 365,24 Tagen zugrunde. Nach wie vielen Jahren muss dann der Schalttag ausfallen?
  2. Da als Jahreslänge 365,2425 benutzt wird, darf der Schalttag aus 1. nicht immer ausfallen. Nach wie vielen Jahren ist dies der Fall?
  3. Nach wie vielen Jahren müßte aufgrund der Differenz zwischen der tatsächlichen und der dem gregorianischen Kalender zugrunde gelegten Jahreslänge ein Schalttag entfallen?

Die Geschichte der Kalender macht die Bedeutung der Schaltjahrregelung deutlich. Es gilt: alle durch vier teilbaren Jahre sind Schaltjahre. Schalttage entfallen in den durch 100 teilbaren Jahren, ausgenommen sind die durch 400 teilbaren Jahre. Wann war das letzte, wann ist das nächste Schaltjahr?

Die in der Schaltjahrregelung auftretenden Perioden 4, 100 und 400 klären die Jahres-Quotienten in der Zellerschen Formel. Der Monats-Quotient beschreibt die konstante Verschiebung des Wochentags beim Monatswechsel.

Fachliche Inhalte

Zur Anzeige eines Kalenders für den Monat Februar braucht man die Schaltjahrregelung. Ihre Umsetzung im Programm erfordert Integer-Arithmetik. Aspekte des strukturierten Programmierens und der Modularisierung werden durch Verwendung von Funktionen zur Berechnung von Schalttagen und Wochentagen thematisiert. Als klassischer Datentyp kommt das Feld vor, in dem die Monatstage gespeichert werden. Abstrakte Datentypen kommen in objektorientierter Form als ComboBox-, SpinEdit- und StringGrid-Komponenten vor. Das fertige Programm finden Sie unter Quelltext.

Ausblick

Die Benutzungsschnittstelle des Kalenders kann ausgebaut werden, z.B. Blättern im Kalender, Monatskalender für eingegebenen Tag.

Als Vertiefung bietet sich die Berechnung von Feiertagen an.