Anzeige
Tutorialbeschreibung

Datums einer Kalenderwoche ermitteln

Datums einer Kalenderwoche ermitteln

 

 

Dieses Tutorial soll euch zeigen, wie man mit der Eingabe einer Kalenderwoche und eines Jahres die passenden Datums zu ermitteln. Ich habe diese Funktion während eines Projektes gebraucht und dachte mir, dass Sie eventuell dem einen oder anderen nutzen könnte.


Ich habe dieses Tutorial in zwei Abschnitte geteilt:

1)      Die Funktion „tag“ zum Ermitteln des Datums eines bestimmten Wochentages

2)      Der Programmcode zur Ausgabe der Datums

 

Also kommen wir zunächst zur Funktion „tag“. Ich werde sie zunächst als Gesamtes darstellen und dann auf die einzelnen Abschnitte eingehen.

Doch bevor wir auf die Funktion zu sprechen kommen, möchte ich einen kurzen Einblick auf die Ideengebung geben. Laut DIN-Norm ISO 8601 ist diejenige Woche die erste Kalenderwoche eines Jahres, in der der erste Donnerstag des Januars liegt. Daraus lässt sich schließen, dass der 4. Januar immer innerhalb der ersten Kalenderwoche liegt.

Und das macht man sich bei dieser Funktion zum Nutzen. Wie, seht ihr jetzt:

 

<?php

function tag($kw, $jahr, $wochentag)

{

$jan_vier = mktime(0,0,0,1,4,$jahr);   

$erster_wtag = mktime(0,0,0,1, (date("d", $jan_vier) + (date("w", $jan_vier) == 0 ? -6 : (1 - date("w", $jan_vier))))+$wochentag, $this->jahr); 

return $erster_wtag + 604800 * ($kw - 1);

}

?>

Als erstes wird mit function tag($kw, $jahr, $wochentag) der Funktionsname und die erwarteten Parameter definiert. Es muss also im Hauptprogramm diese Funktion aufgerufen und dazu die Kalenderwoche, das Jahr und der Wochentag übergeben werden. Bei den Wochentagen sollte beachtet werden, dass der Montag den Wert 0, Dienstag den Wert 1 usw. entspricht.

In der Funktion selbst wird zu Beginn mit mktime(0,0,0,1,4,$jahr) der UNIX-Zeitstempel des 4. Januars errechnet und speichern den Wert in die Variable $jan_vier. Denn egal, welche Kalenderwoche wir im Jahr suchen, wir ermitteln das Datum immer über den ersten Montag der ersten Kalenderwoche.

Nun errechnen wir mit der folgenden Zeile den UNIX-Zeitstempel unseres gesuchten Wochentages innerhalb der ersten Kalenderwoche. Wenn wir also den Mittwoch in der 20. Kalenderwoche, ermitteln wir trotzdem zunächst den Zeitstempel in der ersten Woche.

Innerhalb der mktime() muss der Tag immer individuell geschehen. Dies regelt folgende Abschitt:

(date("d", $jan_vier) + (date("w", $jan_vier) == 0 ? -6 : (1 - date("w", $jan_vier))))+$wochentag

 

date("d", $jan_vier) liefert den Tag innerhalb eines Monats eines bestimmten Zeitstempels. In unserem Fall hätte man auch direkt 4 hinschreiben können, um aber Fremden den Zusammenhang sichtbar zu machen (warum denn die 4), nehmen wir diese Schreibweise.

Es folgt mit (date("w", $jan_vier) == 0 ? -6 : (1 - date("w", $jan_vier))) der komplexeste und auch komplizierteste Teil. Doch wenn man dies etwas auseinander nimmt, scheint es doch ersichtlicher. Denn hierbei handelt es sich um eine simple if-else-Anweisung:

Eins vorweg: date("w", $jan_vier) liefert den numerischen Wert des Wochentages des Zeitstempels (0 = Sontag…6 = Samstag).

Doch nun zur Anweisung – denn eigentlich hätte man auch folgendes schreiben Können:

if (date("w", $jan_vier) == 0)

{

      $wert = -6;

}
else

{

      $wert = (1 - date("w", $jan_vier));

}


Wenn es sich beim 4.Januar also um einen Sonntag handelt (0), soll der gesamte Bereich -6 ergeben, da man ja von Sonntag zu Montag 6 Tage zurückgehen muss. Ansonsten ergibt dieser Bereich 1 minus den numerischen Wert der Woche.

Als kleines Beispiel: der 4.Januar von 2007 ist ein Donnerstag (4). Man muss also nur noch 3 Tage (1-4) zurückgehen, um den Monatstag des Montags der ersten Kalenderwoche zu ermitteln. Und das alles ermitteln wir mit (date("d", $jan_vier) + (date("w", $jan_vier) == 0 ? -6 : (1 - date("w", $jan_vier)))).

Zu diesem Wert addieren wir nun noch den Wert des gesuchten Wochentages und wir haben den Wert für unseren gesuchten Tag in der ersten Kalenderwoche.

Das gesamte Ergebnis des Zeitstempels schreiben wir in die Variable $erster_wtag.

Bleibt also nur noch das Ermitteln unseres gesuchten Datums. Dies geschieht in der return $erster_wtag + 604800 * ($kw - 1)–Zeile. Hier wird der ermittelte Zeitstempel unseres Tages innerhalb der ersten Kalenderwoche mit der Anzahl an Sekunden der dazu zuzählenden Wochen addiert. Dabei wird unser übergebender Wert der Kalenderwoche um eins verringert, da wir uns ja mit dem Zeitstempel aus $erster_wtag schon in der ersten KW befinden.

Damit sind wir auch schon am Ende bei der Funktion. Nun wollen wir aber auch Ergebnisse sehen. Dazu müssen wir einfach nur in einer for-Schleife die Funktion aufrufen und den Wert dann formatiert ausgeben lassen.

for($i=0;$i<=6;$i++)

{

      $tag = tag($kalenderwoche, $jahr, $i);

      echo date("d.m.Y",$tag).”<br />”;

}

Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Portrait von childen
  • 02.04.2010 - 16:25

war sehr hilfreich! Aber bitte das $this->jahr in Zeile 9 noch korrigieren!

Portrait von icehawk2
  • 13.09.2009 - 22:54

danke für tut werd mir das mal durchlesen

Alternative Portrait
-versteckt-(Autor hat Seite verlassen)
  • 03.07.2009 - 15:17

$erster_wtag = mktime(0,0,0,1, (date("d", $jan_vier) + (date("w", $jan_vier) == 0 ? -6 : (1 - date("w", $jan_vier))))+$wochentag, $this->jahr);

das $this->year ist nicht korrekt.

Portrait von Aimnu
  • 22.09.2008 - 13:47

Super Tutorial mit guten Erklärungen. Vielen Dank dafür.

Portrait von Leinemann
  • 08.01.2008 - 12:42

Vorbildlich erklärt. Vielen Dank.

Portrait von Sampiero
  • 26.01.2007 - 17:25

Danke für das Tutorial,wenngleich ich PHP nicht beherrsche.
Gruss.
Sampiero

x
×
×