barrierefreies Webdesign Ingo Turski

zum Inhalt

Ingo

Tips und Tricks:Berechnung der Kalenderwoche (Beispiel Wochenlosung)

Die Berechnung der Kalenderwoche erfordert keine umfangreiche Kalender­routine, wenn man die Datumsfunktionen nutzt, die JavaScript und auch andere Programmiersprachen bereits zur Verfügung stellen.
Kalenderwochen werden in diesem Beispiel zur Ausgabe eines wöchentlich wechselnden Spruches benötigt. Testen Sie das Script über dieses Formular:

Wählen Sie zum Testen das oder

Tag:    Monat:    Jahr: 20   

-- Der Spruch der Woche wird mittels Javascript angezeigt --


<script type="text/javascript">
function KalenderWoche(j,m,t) {
  var Datum = new Date();
  if (!t) {
    j = Datum.getYear(); if (1900 > j) j +=1900;
    m = Datum.getMonth(); t = Datum.getDate();
  }
  else m--;
  Datum = new Date(j,m,t,0,0,1);
  var tag = Datum.getDay(); if (tag == 0) tag = 7;
  var d = new Date(2004,0,1).getTimezoneOffset();
  var Sommerzeit = (Date.UTC(j,m,t,0,d,1) - Number(Datum)) /3600000;
  Datum.setTime(Number(Datum) + Sommerzeit*3600000 - (tag-1)*86400000);
  var Jahr = Datum.getYear(); if (1900 > Jahr) Jahr +=1900;
  var kw = 1;
  if (new Date(Jahr,11,29) > Datum) {
    var Start = new Date(Jahr,0,1);
    Start = new Date(Number(Start) + 86400000*(8-Start.getDay()));
    if(Start.getDate() > 4) Start.setTime(Number(Start) - 604800000);
    kw = Math.ceil((Datum.getTime() - Start) /604800000);
  }
  return kw;
}

function Losung() {
  var kw = KalenderWoche();
  var txt = new Array(53);
  txt[1] = "Hier wird der Spruch der ersten Woche eingetragen";
  txt[2] = "und hier der Spruch der zweiten Kalenderwoche ...";
// ... aber ich kürze das in diesem Beispiel besser ab..;-)
  for (var i=53; i>0; i--) {
    txt[i] = "Losung der " + kw + ". Kalenderwoche";
  }
  document.getElementById("Losung").firstChild.nodeValue = txt[kw];
}
</script>

<p id="Losung">-- Der Spruch der Woche wird mittels Javascript angezeigt --</p>

Der Funktion kann optional ein Datum als Parameter (Jahr,Monat,Tag) übergeben werden. Die Kalenderwoche des 17.8.06 kann z.B. so ausgegeben werden:

document.write(KalenderWoche(2006,8,17)); // Ergebnis: . Kalenderwoche

Lassen Sie die Parameter weg, dann übernimmt die Routine das aktuelle Datum.

Sie interessiert, wie meine kleine Routine funktioniert? Eigentlich simpel, auch wenn ich recht lange dran geknobelt habe: Nachdem das Datum ggfls. ermittelt wurde, bringe ich den Wochentag in die Form 1 für Montag bis 7 für Sonntag und setze das Datum unter Berücksichtigung der Sommerzeit auf den Wochenanfang (+ 1 Sekunde) zurück. Dann ermittle ich das Jahr, wobei die unterschiedlichen Formate abwärtskompatibel angepaßt werden. Wenn der Montag zwischen dem 29. und 31. Dezember liegt, ist es die 1. Kalenderwoche, andernfalls folgt die Berechnung.
Hierzu benötige ich den Montag der ersten Kalenderwoche und setze hierzu den Startwert auf den 1. Januar, addiere die Tage bis zum folgenden Montag und wenn dieser nach dem 4. Januar liegt, wird wieder eine Woche abgezogen. Die hohen Zahlenwerte entsprechen den Angaben in Millisekunden (keine Rechenzeit vergeudet). Jetzt muß nur noch die Differenz der Zeiten durch die Millisekunden einer Woche geteilt und aufgerundet zurückgegeben werden.

Eine andere Anwendung des Scripts ist die Generierung von Links zum Download der Apache-LogDateien von 1und1, deren Dateinamen die aktuelle Kalenderwoche und den Kalendertag enthalten. Hierzu ist außer der Funktion KalenderWoche() der folgende JavaScript-Code und HTML-Quelltext nötig:

function LogFile(lnk) {
  var akt = new Date();
  if (lnk == 1) akt.setTime(Number(akt)-86400000);
  tag = akt.getDay(); if (tag == 0) tag = 7;
  kw = KalenderWoche(akt.getFullYear(),akt.getMonth()+1,akt.getDate());
  var f="/logs/access.log."
  f+=("0"+kw).substr(("0"+kw).length-2,2)+"."+tag;
  document.write(f); document.links[9+lnk].href=f;
}

Aktuelles LogFile:
  <a href="#"><script type="text/javascript">LogFile(0)</script></a>
  <br />
Gestriges LogFile:
  <a href="#"><script type="text/javascript">LogFile(1)</script></a>

Die Funktion LogFile() geht davon aus, daß die Seite im Webspace von 1und1 liegt und vorher im HTML-Quelltext 9 weitere Links stehen (ändern Sie diese Zahl entsprechend).

Es werden dann beim Aufruf der Seite aktuelle Links mit dem folgenden Inhalt dynamisch generiert:

Aktuelles LogFile:
Gestriges LogFile: (bis kurz nach Mitternacht erhältlich)