PHP strtotime und Kalenderwochen

Von in php

Datums­be­rech­nun­gen sind kom­plex, dar­um bie­tet PHP eine umfang­rei­che Befehls­re­fe­renz, die das schwie­ri­ge Rech­nen mit Daten wesent­lich erleich­tert. Heu­te bin ich wie­der über ein Pro­blem gestol­pert, das ohne PHP-​Funktion prak­tisch nicht zu lösen gewe­sen wäre. Bei der Suche nach der rich­ti­gen Syn­tax wur­de ich jedoch in der Funk­ti­ons­re­fe­renz selt­sa­mer­wei­se nicht fün­dig, erst die Benut­zer­kom­men­ta­re lie­fer­ten den ent­schei­den­den Hin­weis. Grund genug, dar­über in mei­nem Blog zu schreiben.

Zur Dis­kus­si­on steht fol­gen­des Pro­blem: Von einem Datum sind ledig­lich Kalen­der­wo­che und Jahr bekannt. Gesucht wird das zuge­hö­ri­ge Datum, z.B. der Mon­tag in bekann­ter Woche. Wie wir sehen wer­den lässt sich in der Funk­ti­on auch der gewünsch­te Wochen­tag abfragen.

Im Blog­bei­trag Wochen eines Jah­res habe ich bereits kurz dar­auf hin­ge­wie­sen, dass man mit den Kalen­der­wo­chen vor­sich­tig umge­hen muss. So kön­nen Tage einer Kalen­der­wo­che eines bestimm­ten Jah­res zeit­lich in einem ande­ren Jahr loka­li­siert sein. Hier ein Bei­spiel: Das Jahr 2009 hat 53 Wochen, der Sams­tag in der 53. Woche hat das Datum 2, aller­dings im Jahr 2010. Was auf den ers­ten Blick tri­vi­al klingt, kann beim Berech­nen gro­ße Schwie­rig­kei­ten berei­ten und die Quel­le schwer auf­find­ba­rer Bugs sein. Mein oben erwähn­ter Arti­kel erklärt die­se Pro­ble­ma­tik näher.

Zurück zum Pro­blem mit gesuch­tem Datum bei gege­be­ner Kalen­der­wo­che und Jahr. Hier bie­tet PHP mit der Funk­ti­on strtot­ime() ein äußerst poten­tes Werk­zeug. Die rich­ti­ge Syn­tax zur Lösung unse­res Pro­blems lau­tet (zur leich­te­ren Ver­ständ­nis mit einem Beispiel):

echo strtotime("2010W09");

PHP wür­de mit die­sen Para­me­tern den 1. März 2010 errech­nen (aller­dings als Timestamp, was der Name der Funk­ti­on bereits andeu­tet). Dabei sind fol­gen­de Anfor­de­run­gen zu beach­ten:
- Das Jahr muss vier­stel­lig über­ge­ben wer­den.
- Ein gro­ßes (!) “W” trennt das Jahr von der Kalen­der­wo­che.
- Die Kalen­der­wo­che muss (!) zwei­stel­lig ange­ge­ben wer­den. Das ist vor allem zu beach­ten, wenn zuvor die Kalen­der­wo­che mit der Funk­ti­on date() und dem Format-​Parameter “W” ermit­telt wur­de. Einer ein­stel­li­gen Kalen­der­wo­che muss eine Null vor­an­ge­stellt wer­den, andern­falls retour­niert die Funk­ti­on strtot­ime() false.

Wird der String wie im Bei­spiel gezeigt über­ge­ben, berech­net PHP immer ein Datum einem Mon­tag in der abge­frag­ten Woche ent­spre­chend. Der retour­nier­te Zeits­tem­pel kann dann über (den lang­wie­ri­gen Umweg) date() und mktime() auf jeden ande­ren Wochen­tag umge­rech­net wer­den. Man kann jedoch über einen wei­te­ren Para­me­ter der strtotime()-Funktion mit­tei­len, wel­cher Wochen­tag zurück­ge­ge­ben wer­den soll und sich damit eine Men­ge Rech­ne­rei und Code erspa­ren. Dann aller­dings muss der String etwas anders aus­se­hen. Ange­nom­men, es soll der Mitt­woch in der 12. Kalen­der­wo­che im Jahr 2009 ermit­telt wer­den, dann müss­te der ent­spre­chen­de String wie folgt gebaut werden:

echo strtotime("2009-W12-3");

strtot­ime() ver­steht hier als nume­ri­sche Reprä­sen­ta­ti­on des Wochen­ta­ges eine 1 für den Mon­tag und eine 7 für Sonn­tag (gleich dem Format-​Zeichen “N” für die Funk­ti­on date(), aber Vor­sicht! Nicht mit “w” ver­wech­seln! Hier fängt die Woche am Sonn­tag mit 0 an und hört am Sams­tag mit 6 auf), dies­mal soll der Wert übri­gens ein­stel­lig sein.

strtot­ime(), eine äußerst wert­vol­le Funk­ti­on. In die­ser Ver­wen­dung fast ein Geheimtipp!

Share on LinkedInShare on Redditshare on TumblrShare on StumbleUponDigg thisShare on FacebookGoogle+Tweet about this on TwitterEmail to someone