Berechnung der Kalenderwoche

Vorbemerkungen

Die hier zugrunde liegende Definition der Kalenderwoche ist international festgelegt und wird in den meisten Ländern Europas auch verwendet. Daneben werden aber, insbesondere außerhalb Europas, auch andere Wochennummerierungen gebraucht. Mehr dazu ist in Abschnitt B.3 meiner Kalender-FAQ zu finden.

Falls Sie einfach nur zu einem Datum die Kalenderwoche wissen wollen, dann nutzen Sie einfach das unten stehende Formular zur Berechnung mit Javascript oder die umfangreichen Möglichkeiten meiner Seite mit verschiedenen Kalenderberechnungen.

Kalenderwochen beginnen mit dem Montag. Jede Woche gehört immer als ganze zu einem Kalenderjahr (es gibt keine halben Kalenderwochen), wodurch dann aber bestimmte Tag am Jahresanfang oder -ende zu einem anderen Jahr gehören können als ihre Kalenderwoche. Da Kalenderjahre ein oder zwei Tage mehr haben als die 364 Tage, die genau 52 Wochen entsprächen, haben die meisten Jahre 52, manche aber 53 Kalenderwochen.

Die Kalenderwochen eines Jahres werden beginnend mit der Woche gezählt, in der der 4. Januar des jeweiligen Jahres liegt. Das ist, wie man leicht zeigen kann, zugleich die Woche, in der der erste Donnerstag des Jahres liegt.

Hier wird ein Algorithmus zur Errechnung der Kalenderwoche aus einem Datum in Form von Pseudo-Code sowie eines kleinen JavaScripts vorgestellt (ohne Gewähr!).

(Früher stand hier ein weniger eleganter Algorithmus, den Sie bei Bedarf hier finden können.)

Algorithmus in Pseudo-Code

wochendonnerstag = donnerstag(datum(j,m,t));
kalenderwochenjahr = jahr(wochendonnerstag);
ersterdonnerstag = donnerstag(datum(kalenderwochenjahr,januar,4));
kalenderwoche = (eptage(wochendonnerstag)-eptage(ersterdonnerstag))/7+1;
print "Kalenderwoche: ",kalenderwoche," des Jahres ",kalenderwochenjahr;

function donnerstag(Datum) {
  # gibt als Datumsobjekt den Donnerstag der Woche 
  # zurück, in der das übergebene "Datum" liegt.
  # 'eptage(Datum) - wochentag(Datum)' ist der Montag,
  # drei Tage später der Donnerstag
  return datum(eptage(Datum) - wochentag(Datum) + 3);
}
function wochentag(Datum) {
  # gibt den  zugehörigen Wochentag als Zahl zurück
  # wobei 0=Montag, 1=Dienstag, ... 6=Sonntag
  # Hinweis: Diese Zuordnung entspricht nicht der in
  # vielen Systemen üblichen Definition, ist hier aber
  # sinnvoll, da Kalenderwochen mit dem Montag beginnen.
  [Code ausgelassen]
}
function datum(.....) {
  # gibt das zugehörige Datumsobjekt zurück
  [Code ausgelassen]
}
function jahr(Datum) {
  # gibt die zu einem Datumsobjekt gehörende 
  # Jahreszahl zurück
  [Code ausgelassen]
}
function eptage(Datum) {
  # gibt die Zahl der Tage zurück, die vom Beginn
  # der (systemspezifischen) Zeitrechnung bis zum "Datum"
  # vergangen sind
  [Code ausgelassen]
}

Berechnung mit Javascript

Datum: .    

Wochentag:   Kalenderwoche:

Und so sieht der JavaScript-Code der Berechnung der Kalenderwoche aus:

Datum=new Date(j,m-1,t); // Anm. 1
DoDat=donnerstag(Datum);
kwjahr=DoDat.getFullYear();
DoKW1=donnerstag(new Date(kwjahr,0,4)); // Anm. 2
kw=Math.floor(1.5+(DoDat.getTime()-DoKW1.getTime())/86400000/7) // Anm. 3, 4

function donnerstag(datum) { // Anm. 5
  var Do=new Date();
  Do.setTime(datum.getTime() + (3-((datum.getDay()+6) % 7)) * 86400000); // Anm. 3
  return Do;
}

Aufgerufen wird diese Berechnung z.B. so:

kw1=kalenderwoche(2005,1,2); // 2. Januar 2005

Anmerkungen zum Javascript:

  1. Es wird angenommen, dass das Datum in Form von drei natürlichen Zahlen in t, m und j vorliegt. 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. Donnerstag der Woche, zu der der 4. Januar gehört.
  3. Der Quotient 86400000 wird benötigt, weil die Javascript-Methode getTime() nicht Tage, sondern Millisekunden zurückgibt.
  4. Hier wird die Kalenderwochennummer errechnet und in kw abgelegt. Exakterweise müsste man zum errechneten Wochenabstand der beiden Donnerstage nur 1 addieren; aber um Rundungsfehler zu vermeiden (Javascript unterscheidet nicht zwischen Fließkomma- und ganzen Zahlen) wird hier um weitere 0.5 erhöht und dann abgerundet.
    Die zur Kalenderwoche gehörende Jahreszahl steht in kwjahr.
  5. Diese Funktion gibt den Donnerstag der Woche, in dem "datum" liegt, als Datumsobjekt zurück.
    Die Methode getDay() liefert den Wochentag (von 0 = Sonntag bis 6 = Samstag). Mit der Addition von 6 und anschließendem Berechnen des Restes beim Teilen durch 7 (mit Hilfe des Modulo-Operators %) ergibt sich der Wochentag in der benötigten Form (0 = Montag bis 6 = Sonntag; siehe oben im Pseudo-Code).

Kalenderwoche in Microsoft Excel 97

Excel 97 bringt keine Kalenderwochenberechnung mit; spätere Versionen haben zum Teil Berechnungen, die nicht der internationalen Norm entsprechen. Daher ist es wünschenswert, eine geeignete Berechnung zu haben.

Man könnte sie in Visual Basic programmieren. Der oben vorgestellte Algorithmus lässt sich aber auch in eine Formel für eine Tabellenzelle von Excel fassen: Nehmen wir an, dass in Zelle B3 eine Datumsangabe steht. Dann können Sie die Kalenderwoche in einer anderen Zelle so errechnen:

[Kalenderwoche, z.B. in Zelle B4:]
(B3-WOCHENTAG(B3;3)+3-DATUM(JAHR(B3-WOCHENTAG(B3;3)+3);1;4)+WOCHENTAG(DATUM(JAHR(B3-WOCHENTAG(B3;3)+3);1;4);3)-3)/7+1

Wenn Sie auch das Jahr zu dieser Kalenderwoche brauchen, dann geht das mit kürzeren Formeln so:

[Kalenderwoche in B4:]
(B3-WOCHENTAG(B3;3)+3-DATUM(B5;1;4)+WOCHENTAG(DATUM(B5;1;4);3)-3)/7+1

[Jahr in B5:]
JAHR(B3-WOCHENTAG(B3;3)+3)

Selbstverständlich sind statt B3 bis B5 bei Bedarf passende andere Tabellenzellen zu wählen.

Die Kalenderwochenberechnung mit Erklärung steht hier auch in Form einer (mit ZIP komprimierten) Excel97-Datei zum Download zur Verfügung.


© 2000-2009 H.v.Hatzfeld

Valid HTML 4.01!   Valid CSS!