Start · Sprachen · PHP · Referenz · date_isodate_set

date_isodate_set

Funktion

Setzt das Datum eines <code>DateTime</code>-Objekts anhand einer ISO-8601-Jahreszahl, Kalenderwochennummer und optionalem Wochentag.

seit PHP 5.2.0 Kategorie: date

Signatur

date_isodate_set(DateTime $object, int $year, int $week, int $dayOfWeek = 1): DateTime

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

Typ
DateTime
Beschreibung
Gibt das modifizierte 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;
2024-03-04 2024-03-08

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
ISO-Wochenjahr: 2020, Woche: 01 2019-12-30

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;
}
Mo: 08.04.2024 Di: 09.04.2024 Mi: 10.04.2024 Do: 11.04.2024 Fr: 12.04.2024 Sa: 13.04.2024 So: 14.04.2024

// 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.