Signatur
Beschreibung
date_isodate_set() ist die prozedurale Variante von DateTime::setISODate() und ermöglicht es, ein DateTime-Objekt auf ein bestimmtes ISO-8601-Datum zu setzen – angegeben durch Jahr, Kalenderwoche (KW) und Wochentag. Der Wochentag ist dabei 1-basiert, wobei 1 für Montag und 7 für Sonntag steht.
Diese Funktion ist besonders nützlich, wenn mit Kalenderwochen gearbeitet wird, etwa in Planungsanwendungen, Schichtplänen oder Berichten, die sich auf bestimmte ISO-Kalenderwochen beziehen. Statt eine Datumsangabe manuell zu berechnen, übernimmt PHP die Konvertierung vom ISO-Wochenformat (YYYY-Www-D) in ein konkretes Kalenderdatum.
Zu beachten ist, dass das ISO-Wochenjahr von dem gregorianischen Jahr abweichen kann: Der 1. Januar kann je nach Wochentag zur letzten Woche des Vorjahres gehören, und der 31. Dezember kann bereits zur ersten Woche des Folgejahres zählen. date_isodate_set() verarbeitet diese Randfälle korrekt gemäß ISO 8601.
Die Funktion verändert das übergebene DateTime-Objekt direkt (in-place) und gibt dasselbe modifizierte Objekt zurück. Mit DateTimeImmutable sollte stattdessen DateTimeImmutable::setISODate() verwendet werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $object Pflicht | DateTime | Das DateTime-Objekt, dessen Datum gesetzt werden soll. Das Objekt wird direkt verändert. |
|
| $year Pflicht | int | Das ISO-8601-Jahr (kann vom gregorianischen Jahr abweichen, insbesondere zu Jahresbeginn und -ende). | |
| $week Pflicht | int | Die Nummer der ISO-Kalenderwoche (1–53). ISO-Wochen beginnen immer mit Montag. | |
| $dayOfWeek | int | 1 | Der Wochentag innerhalb der Kalenderwoche: 1 = Montag, 2 = Dienstag, …, 7 = Sonntag. Standardwert ist 1 (Montag). |
Rückgabewert
DateTime-Objekt zurück. Da das Objekt in-place verändert wird, ist der Rückgabewert identisch mit dem übergebenen $object.Beispiele
Datum einer bestimmten Kalenderwoche ermitteln
<?php
// Montag der 10. Kalenderwoche 2024 ermitteln
$dt = new DateTime();
date_isodate_set($dt, 2024, 10);
echo $dt->format('Y-m-d') . PHP_EOL; // Montag KW 10/2024
// Freitag der 10. Kalenderwoche 2024
date_isodate_set($dt, 2024, 10, 5);
echo $dt->format('Y-m-d') . PHP_EOL;
Jahrswechsel – ISO-Wochenjahr vs. gregorianisches Jahr
<?php
// 30. Dezember 2019 liegt in der ISO-KW 1 des Jahres 2020
$dt = new DateTime('2019-12-30');
echo 'ISO-Wochenjahr: ' . $dt->format('o') . ', Woche: ' . $dt->format('W') . PHP_EOL;
// Montag der ISO-KW 1 des Jahres 2020 berechnen
$dt2 = new DateTime();
date_isodate_set($dt2, 2020, 1, 1);
echo $dt2->format('Y-m-d') . PHP_EOL; // Montag KW 1/2020
Alle Tage einer Kalenderwoche ausgeben
<?php
$woche = 15;
$jahr = 2024;
$tage = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'];
for ($tag = 1; $tag <= 7; $tag++) {
$dt = new DateTime();
date_isodate_set($dt, $jahr, $woche, $tag);
echo $tage[$tag - 1] . ': ' . $dt->format('d.m.Y') . PHP_EOL;
}
// Wichtig · Fallstricke
ISO-Wochenjahr ≠ gregorianisches Jahr: Der Formatbezeichner o in DateTime::format() gibt das ISO-Wochenjahr zurück, während Y das gregorianische Jahr liefert. Zu Jahresbeginn und -ende können diese voneinander abweichen. Bei der Verwendung von date_isodate_set() muss daher stets das ISO-Wochenjahr (Formatbezeichner o) als $year übergeben werden, nicht zwingend das kalendarische Jahr.
Wer unveränderliche Datumsobjekte bevorzugt, sollte DateTimeImmutable::setISODate() verwenden, da date_isodate_set() das übergebene DateTime-Objekt direkt verändert.