Berechnung der Kalenderwoche

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.

Demonstration der Berechnung

Datum: .    

Wochentag:   Kalenderwoche:

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

Anmerkungen:

  1. Mit 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.
  2. Die Funktion 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.
  3. Die Datums-Variable 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).
  4. Hier wird das Datum des Montags der ersten Woche des betrachteten Kalenderjahres berechnet. In 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.
  5. Nun wird als datumT das Datum, dessen Kalenderwoche zu berechnen ist, in die Anzahl von Tagen seit der Javascript-Zeitrechnung umgewandelt.
  6. Zurückgegeben wird von der Funktion 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.
  7. Alle bisherigen Berechnungen können mit ganzen Zahlen durchgeführt werden. In dieser alternativen Variante ist das Script etwas kürzer, braucht aber reale Zahlen (was für Javascript kein Problem ist, aber wohl für manche Übertragungen in andere Programmiersprachen). Der Wert 6048e5 hier ist die Dauer einer Woche in Millisekunden.

© 2000-2004 H.v.Hatzfeld