Kalenderwochen eines Jahres werden beginnend mit der Woche gezählt, in der der 4. Januar des jeweiligen Jahres liegt. Somit haben die meisten Jahre 52, manche aber 53 Kalenderwochen. Und zur ersten oder letzten Kalenderwoche gehören nicht selten Tage, die in einem anderen Jahr liegen. Hier wird ein Algorithmus zur Errechnung der Kalenderwoche aus einem Datum in Form eines kleinen JavaScripts vorgestellt (ohne Gewähr!).
Informationen über die rechtliche Definition der Kalenderwochen sind über die Links in Abschnitt B.3 meiner Kalender-FAQ zu finden.
Und so sieht der JavaScript-Code der eigentlichen Berechnung der Kalenderwoche aus:
function kalenderwoche(jahr,monat,tag) { var datum=new Date(jahr,monat-1,tag); // Anm. 1 var jh=jahr+1; // Anm. 2 var kalwo=kaldiff(datum,jh); while(kalwo<1) { jh--; kalwo=kaldiff(datum,jh); } return kalwo; } function kaldiff(datum,jahr) { var d4j=new Date(jahr,0,4); var wt4j=(d4j.getDay()+6)%7; // Anm. 3 var m1wjT=Math.floor(0.01+d4j.getTime()/864e5-wt4j); // Anm. 4 var datumT=Math.floor(0.01+datum.getTime()/864e5); // Anm. 5 return Math.floor(1+(datumT-m1wjT)/7); // Anm. 6 }
Alternativ kann die zweite Funktion so definiert werden:
function kaldiff(datum,jahr) { var d4j=new Date(jahr,0,4); var wt4j=(d4j.getDay()+6)%7; // Anm. 3 return Math.floor(1.05+(datum.getTime()-d4j.getTime())/6048e5+wt4j/7); // Anm. 7 }
Aufgerufen wird diese Berechnung z.B. so:
kw1=kalenderwoche(2005,1,2); // 2. Januar 2005
new Date
erzeugt Javascript ein Datums-Objekt. Wie bei manchen
anderen Programmiersprachen steht 0 hier für Januar, so dass die Monatszahl
gegenüber der üblichen Zählweise um 1 verringert wird.kaldiff()
wird in den beiden folgenden Zeilen
aufgerufen, um die Nummer der Woche zu berechnen,
in der datum
liegt. Dabei wird definitionsgemäß angenommen,
dass die Zählung am
Montag der ersten Kalenderwoche des Jahres jahr
beginnt.
Zunächst wird wird geprüft, ob kaldiff()
unter der
Annahme ein positives Ergebnis gibt, dass der Tag zu einer Kalenderwoche des Folgejahres
jh
gehört.
Das kann vorkommen, weil ja z.B. der 30.12.1997 zur ersten Kalenderwoche des Jahres
1998 gehört. Andernfalls wird jh
so lange um 1
vermindert,
bis es ein positives Ergebnis gibt.d4j
wurde in der vorangehenden Zeile
auf den 4. Januar gesetzt. Hier wird nun als wt4j
der Wochentag dieses Datums
errechnet,
wobei für Montag eine 0, für Dienstag eine 1, usw., für Sonntag eine 6 steht.
Der Operator %
ist der Modulo-Operator (a % b
ergibt
den Rest bei Teilung von a durch b).m1wjT
wird dieses Datum als Zahl der Tage seit dem Beginn der
Javascript-Zeitrechnung abgespeichert. Die Zahl 864e5 = 86.400.000 ist die Länge eines
Tages in Millisekunden (der Grundeinheit der Javascript-Zeitrechnung). Mit Hilfe von
Math.floor
werden hier die durch Zeitzonenverschiebungen erzeugten
Dezimalbrüche auf ganze Zahlen gebracht.datumT
das Datum, dessen Kalenderwoche zu berechnen ist,
in die Anzahl von Tagen seit der Javascript-Zeitrechnung umgewandelt.kaldiff()
die um 1 erhöhte
abgerundete Anzahl an Wochen, die zwischen den beiden zuvor berechneten Daten liegen.
Das ist die Kalenderwoche, in der datum
liegt.6048e5
hier ist die Dauer einer Woche in Millisekunden.© 2000-2004 H.v.Hatzfeld