Die Wochentagsberechnung (auch Kalenderrechnen genannt) hat zum Ziel, zu einem beliebigen Datum in der Vergangenheit oder Zukunft den Wochentag zu bestimmen. Es gibt dabei verschiedene Methoden, die auf mathematischen Algorithmen beruhen.

Auch ohne Berechnung lässt sich aus Dauer- bzw. Ewigen Kalendern für ein beliebiges Jahr – oder zumindest für einen sehr großen Zeitraum – der zu einem Datum gehörende Wochentag ablesen. Diese Kalender können auch zur Ergebniskontrolle der Algorithmen verwendet werden.

Einführung Um den Wochentag mit Hilfe einer Formel zu berechnen, werden die sieben Wochentage einer Woche durchnummeriert, etwa von Montag = 1 bis Sonntag = 7 (dies entspricht der Norm ISO 8601). Benötigt wird für die Berechnung der Modulo: Er gibt den Rest an, der bei einer ganzzahligen Division übrig bleibt (z. B. 15 mod 7 = 1, denn 15 / 7 ist 2, Rest 1). Für die Wochentagsberechnung wichtig ist insbesondere der Rest modulo 7, den man so interpretieren kann: Ist der 1. Tag eines Monats ein Sonntag, dann ist 7 Tage später, am 8. Tag des Monats, ebenfalls ein Sonntag, da 7 mod 7 = 0. Ebenso ist etwa der 16. Tag des Monats ein Montag, da 15 mod 7 = 1.

Als Grundidee der meisten Algorithmen startet man nun bei einem Datum, für das der Wochentag bekannt ist, dann wird die Anzahl der Tage bis zu dem gesuchten Datum bestimmt. Hierbei müssen u. a. die unterschiedlichen Längen der Monate und die Anzahl der Schaltjahre berücksichtigt werden. Bezüglich der Schaltjahre unterscheiden sich die Verfahren für den gregorianischen und den julianischen Kalender. Aus der Anzahl der Tage seit dem gewählten Starttag kann schließlich mit einer Modulo-7-Rechnung wie oben beschrieben der Wochentag bestimmt werden.

Algorithmus Der folgende Algorithmus wurde im Jahr 1882 von Christian Zeller angegeben.Vgl. Christian Zeller: Die Grundaufgaben der Kalenderrechnung auf neue und vereinfachte Weise gelöst. In: Württembergische Vierteljahrshefte für Landesgeschichte 5 (1882), 314f.Dietmar Herrmann: Algorithmen Arbeitsbuch 1. Auflage 1992, Addison-Wesley, ISBN 3-89319-481-9 Für eine Beschreibung oder Herleitung in Dezimalzahlenschreibweise (13/5=2,6 und 1/5 =0,2) siehe Georg Glaeser.Georg Glaeser: Der mathematische Werkzeugkasten. Anwendungen in Natur und Technik. 3. Auflage. Elsevier, München 2008, ISBN 3-8274-1618-3, siehe S. 408

Formel Die Berechnung des Wochentages erfolgt nach folgender Formel:

Hierbei wird mit mod die Modulo-Operation bezeichnet. Ist das Ergebnis negativ, wird 7 addiert (Beispiel: -19 mod 7 = -5 + 7 = 2). Die eckige Klammer ist die Gaußklammer: Sie gibt die größte ganze Zahl kleiner oder gleich x an, rundet also ab.

Die Variablen haben folgende Bedeutung: d Tagesdatum (1 bis 31) m Monat gemäß unten angeführter Tabelle y Die beiden letzten Stellen der Jahreszahl, bei den Monaten Januar und Februar die letzten Stellen des Vorjahres (für Dez. 1907 also 7, für Jan 1907 6, für Jan 1900 99) c Die beiden ersten Stellen der Jahreszahl, bei den Monaten Januar und Februar die ersten Stellen des Vorjahres (für Dez. 1907 also 19, für Jan 1907 19, für Jan 1900 18) w Wochentag gemäß folgender Tabelle:

{| border="1" cellspacing="0" cellpadding="5" |Tag||Sonntag||Montag||Dienstag||Mittwoch||Donnerstag||Freitag||Samstag |- |w || 0 || 1 || 2 || 3 || 4 || 5 || 6

Der Monat m wird in julianischer Zählung angegeben, damit der Schaltmonat Februar mit seiner Unregelmäßigkeit am Ende des Jahres steht. Es ergibt sich folgende Tabelle:

{| border="1" cellspacing="0" cellpadding="5" |Monat||März ||April ||Mai ||Juni ||Juli ||August ||September ||Oktober ||November ||Dezember ||Januar ||Februar |- |m = || 1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 || 10 || 11 || 12 |- |[2,6 m - 0,2] mod 7 = || 2 || 5 || 0 || 3 || 5 || 1 || 4 || 6 || 2 || 4 || 0 || 3

Demzufolge währt ein Jahr von März bis Februar. Da für Januar und Februar m = 11 bzw. m = 12 gilt, muss für diese beiden Monate die Jahreszahl bei der Berechnung um 1 vermindert werden.

Beispiele 12. Juni 2006: d = 12 m = 4 y = 6 c = 20

A = 12 + [2.6*4 – 0.2] + 6 + [6/4] + [20/4] – 2*20 A = 12 + 10 + 6 + 1 + 5 - 40 A = -6 w = -6 mod 7 w = 1 entspricht Montag.

12. Januar 2006: Hier muss die Variable y um 1 auf 5 vermindert werden: d = 12 m = 11 y = 5 c = 20

A = 12 + [2.6*11 – 0.2] + 5 + [5/4] + [20/4] – 2*20 A = 12 + 28 + 5 + 1 + 5 - 40 A = 11 w = 11 mod 7 w = 4 entspricht Donnerstag.

1. Januar 2000: Hier muss die Variable y auf 99 und c auf 19 vermindert werden: d = 1 m = 11 y = 99 c = 19

A = 1 + [2.6*11 – 0.2] + 99 + [99/4] + [19/4] – 2*19 A = 1 + 28 + 99 + 24 + 4 - 38 A = 118 w = 118 mod 7 w = 6 entspricht Samstag.

Herleitung der Formel Die Herleitung erfolgt in vier Schritten:

1. Formel, die nur für einen Monat gilt (1) w = (d + k1) mod 7

w ist dabei der gesuchte Wochentag, d das Tagesdatum (1–31). k1 ist ein Korrektursummand, der für jeden Monat angibt, auf welchen Wochentag der Vormonat endete. Mod 7 gibt den kleinsten positiven Rest beim Teilen durch 7 an, dabei kann das Ergebnis nur im Bereich von 0 bis 6 liegen. Beispielrechnung: 22 : 7 = 3 Rest 1, also 22 mod 7 = 1.

Beispiel Zur Berechnung des Wochentags vom 17. August 2007 muss man wissen, dass der Juli 2007 mit einem Dienstag endete, also d = 17 und Korrektursummand k1 = 2. Man berechnet:

w = (17 + 2) mod 7 = 19 mod 7 = 5 5 entspricht Freitag.

2. Formel, die für ein ganzes Jahr gilt Nun hat man für jeden Monat eine unterschiedliche Formel. Um zu einer Formel zu gelangen, die für ein Jahr lang gültig ist, legt man zuerst den März als ersten Monat des (julianischen) Jahres fest (m = 1). Mit dieser julianischen Monatszählung umgeht man das Problem, dass der unregelmäßige Schalttag 29. Februar mitten im Jahr liegt und die Formel "stört" bzw. verkompliziert. Da die Monate mit verschiedenen Wochentagen beginnen, benötigt man anstatt des Korrektursummanden k1 eine "Sprungfunktion" s, die für jeden Monat den korrekten Wochentag des Vormonats liefert. Dazu wird untersucht, wie der Wochentag des 1. März zu jedem anderen Monatsbeginn "weiterspringt":

{| border="1" cellspacing="0" cellpadding="5" | Monatswechsel... | Monatszahl | Sprung um... | aufsummiert | s(m) = |- | von März auf April |m = 2 |3 Tage |3 Tage |3 mod 7 |- | von April auf Mai |m = 3 |2 Tage |5 Tage |5 mod 7 |- | von Mai auf Juni |m = 4 |3 Tage |8 Tage |1 mod 7 |- | von Juni auf Juli |m = 5 |2 Tage |10 Tage |3 mod 7 |- | von Juli auf August |m = 6 |3 Tage |13 Tage |6 mod 7 |- | von August auf September |m = 7 |3 Tage |16 Tage |2 mod 7 |- | von September auf Oktober |m = 8 |2 Tage |18 Tage |4 mod 7 |- | von Oktober auf November |m = 9 |3 Tage |21 Tage |0 mod 7 |- | von November auf Dezember |m = 10 |2 Tage |23 Tage |2 mod 7 |- | von Dezember auf Januar |m = 11 |3 Tage |26 Tage |5 mod 7 |- | von Januar auf Februar |m = 12 |3 Tage |29 Tage |1 mod 7 |- | (von Februar auf März) |m = 1 |0 oder 1 d |29 oder 30 d |1 oder 2

Insgesamt springt der Monatsbeginn vom 1. März bis zum 1. Februar um 29 Wochentage weiter, in den 11 Monatssprüngen also durchschnittlich um 29 / 11 ≈ 2,6 Wochentage.

Die gesuchte Sprungfunktion s soll also für m die Werte in der Spalte s(m) liefern. Dafür steht der Term

[2,6 m] mod 7

Hierbei wird 2,6 mit m multipliziert, die Nachkommastellen mittels der Gaußklammer [ ] „abgeschnitten“ und anschließend mod 7 reduziert. Da die Ergebnisse alle um 2 zu hoch sind, wird 2 abgezogen:

([2,6 m] – 2) mod 7

Dann sind die Werte von m = 5 und m = 10 aber noch um 1 zu groß. Man muss die Formel so verändern, dass die Ergebnisse nur an diesen zwei Stellen korrigiert werden: Dafür müssen die Ergebnisse in den Gaußklammern dieser beiden Monate Juli und Dezember um 1 verringert, die anderen Ergebnisse dürfen aber nicht verändert werden. Bei m = 5 und m = 10 ergibt sich für den Wert innerhalb der Gaußklammer immer eine ganze Zahl, bei den anderen Monaten ein um mindestens 0,2 über einer Ganzzahl liegender Wert. Man zieht also einen Wert größer 0 und kleiner gleich 0,2 ab; meistens wird 0,2 gewählt:

s(m) = ([2,6 m - 0,2] – 2) mod 7

Wenn man s(m) anstatt des Korrektursummanden k1 in die obige Formel (1) einsetzt, erhält man als Wochentagsformel, die ein Jahr lang gültig ist:

(2) w = (d + [2,6 m - 0,2] - 2 + k2) mod 7

Der Korrektursummand k2 gibt dabei den Wochentag vom Vortag des 1. März des betreffenden Jahres an.

Beispiel Die folgende Wochentagsformel für 2007 ist gültig vom 1. März 2007 bis zum 29. Februar 2008. Da der Vortag des 1. März 2007 ein Mittwoch ist, gilt k2 = 3:

w = (d + [2,6 m - 0,2] - 2 + 3) mod 7 = (d + [2,6 m - 0,2] +1) mod 7

3. Formel, die für ein ganzes Jahrhundert gilt Nun muss man die Formel (2) so variieren, dass sie über mehrere Jahre hinweg gültig ist. Dazu muss der Wochentag in jedem Jahr um einen Tag "weitergeschoben" werden, da ein Normaljahr aus 52 Wochen und einem Tag besteht. In jedem Schaltjahr muss der Wochentag um 2 Tage vorrücken.

y steht für die letzten beiden Ziffern des Jahres (bei 1992 also y = 92). Da es alle vier Jahre ein Schaltjahr gibt, muss man noch y/4 addieren. Dabei würde sich bei 1995 zum Beispiel 95/4 = 23,75 ergeben. Weil man aber eine ganze Zahl benötigt, setzt man den Term in die Gaußklammer: [y/4]; diese "schneidet" die Ziffern hinter dem Komma ab. 23,75 in der Gaußklammer wird also zu 23, denn im 20. Jahrhundert gab es vor 1995 genau 23 Schaltjahre.

Setzt man nun den Term y + [y/4] anstelle des Korrektursummanden k2 in die Formel (2) ein, erhält man eine Wochentagsformel, die für ein Jahrhundert gültig ist:

(3) w = (d + [2,6 m - 0,2] - 2 + y + [y/4] + k3) mod 7

Der Korrektursummand k3 gibt dabei den Wochentag an, mit dem das vorausgegangene Jahrhundert endete.

Beispiele 2000 war ein Schaltjahr. Der Vortag des 1. März 2000, der 29. Februar 2000, war ein Dienstag, also k3 = 2. Folglich lautet die Wochentagsformel für das 21. Jahrhundert:

w = (d + [2,6 m - 0,2] - 2 + y +[y/4] + 2) mod 7

Sie ist gültig vom 1. März 2000 bis zum 28. Februar 2100.

1900 war kein Schaltjahr. Der Vortag des 1. März 1900, der 28. Februar 1900, war ein Mittwoch, also k3 = 3. Folglich lautet die Wochentagsformel für das 20. Jahrhundert:

w = (d + [2,6 m - 0,2] - 2 + y +[y/4] + 3) mod 7

Sie ist gültig vom 1. März 1900 bis zum 29. Februar 2000.

4. Allgemeingültige Formel Nun muss die Formel (3) noch kompatibel für mehrere Jahrhunderte gemacht werden. Im gregorianischen Kalender sind Jahre, welche ohne Rest durch 100, aber nicht durch 400 teilbar sind, keine Schaltjahre. Dagegen bleiben durch 400 teilbare Jahre Schaltjahre, wie auch alle anderen durch 4, aber nicht durch 100 teilbaren Jahre.

Die Anzahl dieser besonderen alle 400 Jahre auftretenden Schaltjahre berechnet man mit der Formel [c/4], wobei c für die ersten beiden Ziffern in der vierstelligen Jahresangabe steht, von c/4 wird wieder die Gaußklammer [ ] gebildet. Im Jahr 1963 (c = 19, y = 63) ergibt sich z. B. [19/4] = 4.

Weiterhin muss bedacht werden, dass bei den Sprüngen "über das Jahrhundert hinweg" der Wert von y + [y/4] jedes Mal von 99 + 24 = 123 = 4 mod 7 zu 00 + 0 = 0 wird. Dieser Wert darf jedoch nicht 0, sondern muss 5 sein, da mit der Jahreszahl auch der Wochentag um 1 vorrückt. Diese 5 muss bei jedem Jahrhundertwechsel addiert werden. Da 5 = −2 mod 7 gilt, entspricht der Sprung von +5 gerade −2. Daher kann man die Nullung von y + [y/4] und den hinzugekommenen Tag bei den Jahrhundertsprüngen durch den Summanden −2c ausgleichen.

In der Formel (3) kann man nun den Korrektursummanden k3 folgendermaßen ersetzen:

k3 = [c/4] − 2c + k4

Über die Wahl von k4 muss die Formel noch "justiert" werden. Die bisherige Formel liefert für den 15. Oktober 1582 einen Mittwoch, es war aber ein Freitag. Also gilt k4 = 2, was zusammen mit der bisherigen −2 zufälligerweise 0 ergibt. Insgesamt erhält man also die gesuchte Wochentagsformel:

w = (d + [2,6 m – 0,2] + y + [y/4] + [c/4] – 2c) mod 7

Programmierung