Arbeit mit Kalenderwochen

Für die Arbeit mit Zeitdaten bietet PHP seit jeher Funktionen und Klassen an, z.B. um verschiedene Informationen wie Tag, Monat, Jahr aus einem Datum zu ermitteln. Bei der Arbeit mit Kalenderwochen ist dies allerdings nicht ganz so einfach.

Aus gegebenem Anlass möchte ich von einem Problem berichten, über das wahrscheinlich jeder mal stolpert, der eine Statistik oder eine andere datumsbezogene Anwendung entwickelt. Möchte man Informationen aus einem Datum abfragen, greift man einfach auf DateTime::format() zurück. Für die Ausgabe der Kalenderwoche bietet sich der Parameter W an:

$date = new DateTime();
echo $date->format('W'); // Ausgabe am 15.12.14: 51

Laut PHP-Manual liefert der Parameter W die

ISO-8601 Wochennummer des Jahres, die Woche beginnt am Montag (hinzugefügt in PHP 4.1.0)

Aufpassen muss man aber “zwischen den Jahren”. Folgendes Beispiel verdeutlicht dies:

$date = DateTime::createFromFormat('Y-m-d', '2014-12-31');
echo $date->format('W'); // Ausgabe: 01

Wenn die letzte Woche eines Jahres weniger als 4 Tage hat, gehört diese Kalenderwoche laut ISO-8601 bereits zum nächsten Jahr. Zu welchem Jahr die Woche gerechnet wird, bestimmt der Donnerstag dieser Woche. Liegt er im alten Jahr, zählt die Woche zum alten Jahr (52. KW). Liegt er im neuen Jahr, zählt die Woche zum neuen Jahr (1. KW). Das ist auch recht logisch, da ein Jahr ja nur 52 Wochen hat. Wenn die erste und die letzte Woche allerdings unvollständig sind, würde man sonst auf 53 Wochen kommen. Deshalb zählt man die letzte Woche des alten und die erste Woche des neuen Jahres zur gleichen Kalenderwoche, es sei denn der 31.12. ist ein Sonntag (dann gibt es sowieso keine Probleme).

Damit man trotzdem weiß, zu welchem Jahr der Datensatz nun gehört (allein der Parameter W reicht ja nicht, da Kalenderwoche 01 ja sowohl am Anfang als auch am Ende des Jahres liegen kann), kann man den Parameter o nutzen. Dieser liefert das Jahr nach ISO-8601 zurück.

$date = DateTime::createFromFormat('Y-m-d', '2014-12-31');
echo $date->format('o-W'); // Ausgabe: 2015-01
Dieser Beitrag wurde in   PHP veröffentlicht.
Fügen Sie ein Lesezeichen für den   permanenten Link hinzu.

Jan hat 152 Beiträge geschrieben

2 Kommentare zu “Arbeit mit Kalenderwochen

  1. Micha sagt:

    Im Übrigen gibt es natürlich auch Jahre mit 53 Wochen:

    $date = DateTime::createFromFormat('Y-m-d', '2015-12-31');
    echo $date->format('o-W'); // Ausgabe: 2015-53

    Bzw.

    $date = DateTime::createFromFormat('Y-m-d', '2016-01-01');
    echo $date->format('o-W'); // Ausgabe: 2015-53

    Widerspricht natürlich deinem Beitrag in keinster Weise …

    Micha

  2. Marc sagt:

    In den USA sind teilweise auch andere Definitionen von Kalenderwochen in Gebrauch, nämlich dass der 1. Januar stets der Anfang der ersten Kalenderwoche eines Jahres ist. So berechnet es auch Excel, was in der Folge schon zu einiger Verwirrung gesorgt hat.

Eine Antwort schreiben

Ihre E-Mail-Adresse wird nicht veröffentlicht. Benötigte Felder sind markiert mit *

You may use these HTML tags and attributes: <a href=""> <blockquote cite=""> <pre lang=""> <b> <strong> <i> <em>