|
Die Berechnung des Wochentages ist prinzipiell recht einfach, wenn erst der
Wochentag eines bestimmten Tages bekannt ist, können alle anderen Tage abgezählt
werden. Dies ist auch das Schema hier: Zunächst wird der Wochentag für den ersten
Januar bestimmt, und dann wird der gewünschte Tag "abgezählt"
6.3.1 Der 1. Januars eines Jahres
Die Funktion CurrentDoomDay berechnet den Wochentag des ersten Tages des Jahres.
Dazu muss man wissen, dass die Wochentage des 1. Januar der Jahrhunderte im
gregorianischen Kalender immer wieder gleich beginnen. Ist das Jahrhundert (die
ersten beiden Stellen des Jahres) glatt durch vier teilbar, fängt es mit einem
Samstag an. Ergibt sich bei der Teilung ein Rest von 1 ist es Freitag, ...
(Die Zahl in CenturyDoomDay bezieht sich auf die Position in WochenTage.)
var WochenTage = new Array
("Mo","Di","Mi","Do","Fr","Sa","So");
...
function CurrentDoomDay(jahr) {
var CenturyDoomDay = new Array (5,4,2,0);
var CC = Math.floor(jahr/100);
var YY = jahr%100;
var CCDoomDay = CenturyDoomDay[CC%4];
var YYDoomDay = 0;
if (YY == 0)
YYDoomDay = CCDoomDay;
else if (YY%12 == 0)
YYDoomDay = (CCDoomDay + YY/12 - 1) % 7;
else YYDoomDay = ( CCDoomDay
+ (Math.floor(YY/12)
+ (YY%12)
+ Math.floor(((YY-1)%12)/4))
) % 7;
if ((CC%4 == 0) && (YY != 0))
YYDoomDay = (YYDoomDay + 1) % 7;
return YYDoomDay;
}
|
Interessanterweise erhöhen sich die Wochentage eines Datums nach zwölf Jahren
um eines, also ist der 12. März 1958 ein Mittwoch und der 12. März 1970 ein
Donnerstag. Es ergibt sich also für den 1. Januar eines beliebigen Jahres: Wie oft
hat sich seit Beginn des Jahrhunderts der Wochentag um eins verschoben (ganzahliges
Teilen durch 12) und um wieviel Resttage verschiebt es sich weiter? Bei den Resttagen
ist es wichtig, zu wissen wieviel Schaltjahre darin sind, also durch 4. Diese drei
Zahlen aufaddiert und durch sieben geteilt, ergibt der Rest die Verschiebung des
Wochentages seit Beginn des Jahrhunderts. (vgl. Doomsday Algorithm)
Dies abgebildet auf die WochenTage wird zurückgegeben.
Leider hatte sich in meinem ursprünglichen Algorithmus ein Fehler eingeschlichen,
der aber von Sven Schottke erkannt und auch behoben werden konnte. Hier jetzt also
die korrigierte Version.
6.3.2 Ein beliebiger Tag im Jahr
var WochenTage = new Array
("Mo","Di","Mi","Do","Fr","Sa","So");
...
function Wochentag(tag,monat,jahr) {
var WchTag1Jan = CurrentDoomDay(jahr);
var Tage = Tag_des_Jahres(tag,monat,jahr) - 1;
var Wochentag = (WchTag1Jan+(Tage%7))%7;
return WochenTage[Wochentag];
}
|
Wenn der Wochentag des ersten Januars eine Jahres erst bekannt ist
(CurrentDoomDay), dann ist die Ermittlung des Wochentages eines
beliebigen Tages des Jahres einfach. Dazu wird zunächst die Tageszahl
für das Datum berechnet. Wenn man die Vielfachen von 7 daraus wegläßt,
ergibt sich die Verschiebung zum 1. Januar. Dieses brauch dann nur
noch auf unser bereits bekanntes WochenTage-Feld abgebildet werden.
Eine andere Art den Wochentag zu bestimmen, ergibt sich über die
julianische Tageszahl (s.u.) Da diese als Tag Null
Montag, den 1. Januar 4713 n.Chr. angibt, ergibt der Rest der ganzzahligen
Division des julianischen Tages mit sieben den jeweiligen Wochentag.
Anmerkung: Der bisher hierfür gemeldete Fehler, resultiert aus einem
Fehler in der Berechnung des Wochentages des 1. Januars des aktuellen Jahres.
Der Fehler steckte also nicht in dieser Prozedur, sondern in
CurrentDoomDay. Zu dem Fehler ist es gekommen, weil die
Übernahme des Doomsday-Algorithmus eine Korrektur verlangt, wenn nicht der
letzte des Februars sondern der erste Januar als Doomsday benutzt wird.
Hierdurch verschiebt sich nämlich die zwölfer Periode innerhalb des
Jahrhunderts.
| |