[News]Aus Kalenderwoche das Montagsdatum ermitteln

Wie berechne ich zu einer gegebenen Kalenderwoche das entsprechende
Montagsdatum?

© 2003 by Björn Schotte
[Dieser Text erschien ursprünglich im Newsletter von rent-a-phpwizard.de: http://news.rent-a-phpwizard.de/0104/ ]

Vor kurzem stand ich vor dem Problem, für einen webbasierten Kalender, bei
dem man ausschließlich über die Kalenderwoche blättert, zu einem gegebenen
Datum die richtige Kalenderwoche zu suchen. Per IRC, Google, Usenet und
Mailingliste machte ich mich auf die Suche und fand heraus, dass auch schon
andere vor dem Problem standen. Befriedigende Lösungen gab es allerdings
nicht. Hinweise, dass es in einer der PEAR Pakete etwas zum Thema
Berechnung gäbe, konnte ich nicht abschließend verifizieren, da ich für die
Problemstellung kein weiteres bloated OO Paket installieren wollte.

Doch kurz zur Theorie: die 1. Kalenderwoche eines Jahres ist in ISO8601 als
die Kalenderwoche definiert, die den ersten Donnerstag des Jahres enthält.

Von einem gegebenen Timestamp die Kalenderwoche zu errechnen ist einfach:
date(‚W‘,$timestamp); und gut ist.

Aus der Theorie folgt der Schluß: um von einer gegebenen Kalenderwoche auf
das entsprechende Datum des Montags in dieser KW zu kommen, muß ich
zunächst das Datum des Montags in der 1. Kalenderwoche bestimmen und dann
einfach nach vorne rechnen. Warum? Weil die 1. Kalenderwoche eines Jahres
bereits im Jahr davor beginnen kann. Beispiel: der 29. Dezember 2003 war
der Montag der 1. KW des Jahres 2004.

Wie rechnet man nun auf den Montag der 1. KW eines Jahres? Wir benötigen
die Werkzeuge mktime, date und ein paar Additionen, Subtraktionen und
Multiplikationen. Doch zunächst der Reihe nach:

Berechne den Wochentag des 1.1. des gewünschten Jahres. Sei $tag=1 und
$monat=1 und $jahr=2004, so schriebe man $wtag = date(‚w‘,mktime
(0,0,0,$monat,$tag,$jahr)); , um an die numerische Repräsentation des
Wochentags des 1.1.2004 zu kommen. Heraus kommt, dass $wtag in diesem Fall
eine 4 darstellt, also einen Donnerstag.

Wir erinnern uns an die Regel: die 1. Kalenderwoche eines Jahres ist die
Woche, die den ersten Donnerstag des Jahres enthält. Ist also $wtag

<?php function firstkw($jahr) {
$erster = mktime(0,0,0,1,1,$jahr); $wtag = date('w',$erster); if ($wtag /\*\* \* Donnerstag oder kleiner: auf den Montag zurückrechnen. \*/ $montag = mktime(0,0,0,1,1-($wtag-1),$jahr); } else { /\*\* \* auf den Montag nach vorne rechnen. \*/ $montag = mktime(0,0,0,1,1+(7-$wtag+1),$jahr); } return $montag; } ?\> Die Funktion liefert, zur einfacheren Verwertung, einen Unix Timestamp zurück. Nun haben wir das 1. Etappenziel erreicht: wir können zu einem gegebenen Jahr den Timestamp des Montags der 1. KW in diesem Jahr bekommen. Zeit für Hilfsfunktion 2: diese soll zu einer bestimmten KW eines Jahres den Timestamp des Montags in dieser KW zurückliefern. Die Idee ist einfach: gib mir den Montag der 1. KW des gegebenen Jahres und addiere ($kw-1)\*7 Tage darauf ($kw ist die gegebene Kalenderwoche des Jahres). <?php function mondaykw($kw,$jahr) {
$firstmonday = firstkw($jahr); $mon\_monat = date('m',$firstmonday); $mon\_jahr = date('Y',$firstmonday); $mon\_tage = date('d',$firstmonday); $tage = ($kw-1)\*7; $mondaykw = mktime(0,0,0,$mon\_monat,$mon\_tage+$tage,$mon\_jahr); return $mondaykw; } ?\> Einen großen Nutzen bei Datumsberechnungen aller Art liefert Ihnen mktime (). Sie können zum 1.1.2004 einfach 178 Tage drauf rechnen, und sie landen im richtigen Monat im richtigen Jahr. Auf Basis des Timestamps, den Ihnen mondaykw() zurückliefert, können Sie nun Ihren Kalender für die aktuell (z.B. per $\_GET übergebene) ausgewählte Kalenderwoche aufbauen. Sollten Sie Kommentare oder Anmerkungen oder gar einen Fehler gefunden haben, so schreiben Sie mir an [[email protected]](mailto:[email protected]).

hi,

kein Problem. folgenmdermassen klappt das ganz wundervoll:

die Fuznktion time () (lt. php.net)
Gibt die seit Beginn der Unix-Epoche (Januar 1 1970 00:00:00 GMT) bis jetzt vergangenen Sekunden zurück.

dann ziehen wir doch, wenn wir wissen wieviele tage wir abrechnen muessen, was man auch ohne probleme rausfinden koennen. aktuelles datum unter date, den heutigen tag minus der differenz tage in sekunden. anschliessend kann man ohne probleme via timestamp, das datum in ein gängiges format bringen.

Wie berechne ich zu einer gegebenen Kalenderwoche das
entsprechende
Montagsdatum?

ich habe jetzt gerade selber erst unter php.net nachgeschaut. am besten die funktionen noch einmal selber ueberpruefen.

http://de.php.net/manual/de/function.time.php

hth

  • josh -

© 2003 by Björn Schotte
[Dieser Text erschien ursprünglich im Newsletter von
rent-a-phpwizard.de: http://news.rent-a-phpwizard.de/0104/ ]

Vor kurzem stand ich vor dem Problem, für einen webbasierten
Kalender, bei
dem man ausschließlich über die Kalenderwoche blättert, zu
einem gegebenen
Datum die richtige Kalenderwoche zu suchen. Per IRC, Google,
Usenet und
Mailingliste machte ich mich auf die Suche und fand heraus,
dass auch schon
andere vor dem Problem standen. Befriedigende Lösungen gab es
allerdings
nicht. Hinweise, dass es in einer der PEAR Pakete etwas zum
Thema
Berechnung gäbe, konnte ich nicht abschließend verifizieren,
da ich für die
Problemstellung kein weiteres bloated OO Paket installieren
wollte.

Doch kurz zur Theorie: die 1. Kalenderwoche eines Jahres ist
in ISO8601 als
die Kalenderwoche definiert, die den ersten Donnerstag des
Jahres enthält.

Von einem gegebenen Timestamp die Kalenderwoche zu errechnen
ist einfach:
date(‚W‘,$timestamp); und gut ist.

Aus der Theorie folgt der Schluß: um von einer gegebenen
Kalenderwoche auf
das entsprechende Datum des Montags in dieser KW zu kommen,
muß ich
zunächst das Datum des Montags in der 1. Kalenderwoche
bestimmen und dann
einfach nach vorne rechnen. Warum? Weil die 1. Kalenderwoche
eines Jahres
bereits im Jahr davor beginnen kann. Beispiel: der 29.
Dezember 2003 war
der Montag der 1. KW des Jahres 2004.

Wie rechnet man nun auf den Montag der 1. KW eines Jahres? Wir
benötigen
die Werkzeuge mktime, date und ein paar Additionen,
Subtraktionen und
Multiplikationen. Doch zunächst der Reihe nach:

Berechne den Wochentag des 1.1. des gewünschten Jahres. Sei
$tag=1 und
$monat=1 und $jahr=2004, so schriebe man $wtag =
date(‚w‘,mktime
(0,0,0,$monat,$tag,$jahr)); , um an die numerische
Repräsentation des
Wochentags des 1.1.2004 zu kommen. Heraus kommt, dass $wtag in
diesem Fall
eine 4 darstellt, also einen Donnerstag.

Wir erinnern uns an die Regel: die 1. Kalenderwoche eines
Jahres ist die
Woche, die den ersten Donnerstag des Jahres enthält. Ist also
$wtag

<?php :function firstkw($jahr) {
$erster = mktime(0,0,0,1,1,$jahr); $wtag = date('w',$erster); if ($wtag /\*\* \* Donnerstag oder kleiner: auf den Montag zurückrechnen. \*/ $montag = mktime(0,0,0,1,1-($wtag-1),$jahr); } else { /\*\* \* auf den Montag nach vorne rechnen. \*/ $montag = mktime(0,0,0,1,1+(7-$wtag+1),$jahr); } return $montag; } ?\> Die Funktion liefert, zur einfacheren Verwertung, einen Unix Timestamp zurück. Nun haben wir das 1. Etappenziel erreicht: wir können zu einem gegebenen Jahr den Timestamp des Montags der 1. KW in diesem Jahr bekommen. Zeit für Hilfsfunktion 2: diese soll zu einer bestimmten KW eines Jahres den Timestamp des Montags in dieser KW zurückliefern. Die Idee ist einfach: gib mir den Montag der 1. KW des gegebenen Jahres und addiere ($kw-1)\*7 Tage darauf ($kw ist die gegebene Kalenderwoche des Jahres). <?php :function mondaykw($kw,$jahr) {
$firstmonday = firstkw($jahr); $mon\_monat = date('m',$firstmonday); $mon\_jahr = date('Y',$firstmonday); $mon\_tage = date('d',$firstmonday); $tage = ($kw-1)\*7; $mondaykw = mktime(0,0,0,$mon\_monat,$mon\_tage+$tage,$mon\_jahr); return $mondaykw; } ?\> Einen großen Nutzen bei Datumsberechnungen aller Art liefert Ihnen mktime (). Sie können zum 1.1.2004 einfach 178 Tage drauf rechnen, und sie landen im richtigen Monat im richtigen Jahr. Auf Basis des Timestamps, den Ihnen mondaykw() zurückliefert, können Sie nun Ihren Kalender für die aktuell (z.B. per $\_GET übergebene) ausgewählte Kalenderwoche aufbauen. Sollten Sie Kommentare oder Anmerkungen oder gar einen Fehler gefunden haben, so schreiben Sie mir an [[email protected]](mailto:[email protected]).

ups, wer lesen kann ist schlauer
OT. ups, wer lesen kann ist schlauer.
dachte das hier wäre ein frage.

  • josh -