Start · Sprachen · PHP · Referenz · DatePeriod

DatePeriod

Klasse

Stellt einen Datumsbereich dar, über den iteriert werden kann, um regelmäßig wiederkehrende Datumspunkte zu erzeugen.

seit PHP 5.3.0 Kategorie: date

Signatur

class DatePeriod implements IteratorAggregate, Traversable

Beschreibung

DatePeriod ermöglicht es, einen Zeitraum mit einem Startdatum, einem Intervall (DateInterval) und entweder einem Enddatum oder einer Anzahl von Wiederholungen zu definieren. Beim Iterieren über das Objekt liefert es alle Datumspunkte innerhalb dieses Zeitraums im angegebenen Rhythmus zurück.

Typische Anwendungsfälle sind das Generieren von Terminen für Kalenderanwendungen, das Berechnen von Zahlungsintervallen (z. B. monatliche Raten), das Erstellen von Berichtsperioden oder das Erzeugen von Datumslisten für Diagramme und Statistiken.

Seit PHP 8.2 implementiert DatePeriod das IteratorAggregate-Interface und kann daher direkt in foreach-Schleifen verwendet werden. Das Startdatum ist standardmäßig im Ergebnis enthalten; durch das Flag DatePeriod::EXCLUDE_START_DATE kann es ausgeschlossen werden.

Ab PHP 8.3 gibt es ergänzend DatePeriod::createFromISO8601String(), das die Erzeugung über einen ISO-8601-Wiederholungsstring erlaubt.

Parameter

Name Typ Default Beschreibung
$start Pflicht DateTimeInterface|string Das Startdatum des Zeitraums. Entweder ein DateTimeInterface-Objekt oder (bei der ISO-8601-Variante) ein String im Format R<n>/<start>/<interval>/<end>.
$interval DateInterval Das Intervall zwischen den einzelnen Datumspunkten als DateInterval-Objekt, z. B. new DateInterval('P1M') für monatlich.
$end DateTimeInterface|int Das Enddatum als DateTimeInterface-Objekt oder die Anzahl der Wiederholungen als int. Bei einem Enddatum ist dieses selbst nicht im Ergebnis enthalten.
$options int 0 Optionales Bitmask-Flag. Aktuell unterstützt wird DatePeriod::EXCLUDE_START_DATE, um das Startdatum aus der Iteration auszuschließen.

Beispiele

Monatliche Termine für ein Quartal erzeugen

<?php
$start    = new DateTime('2024-01-01');
$interval = new DateInterval('P1M'); // 1 Monat
$end      = new DateTime('2024-04-01');

$period = new DatePeriod($start, $interval, $end);

foreach ($period as $date) {
    echo $date->format('d.m.Y') . PHP_EOL;
}
01.01.2024 01.02.2024 01.03.2024

Wöchentliche Wiederholungen mit Startdatum ausschließen

<?php
$start    = new DateTimeImmutable('2024-06-01');
$interval = new DateInterval('P1W'); // 1 Woche
$recur    = 4; // 4 Wiederholungen

$period = new DatePeriod(
    $start,
    $interval,
    $recur,
    DatePeriod::EXCLUDE_START_DATE
);

foreach ($period as $date) {
    echo $date->format('d.m.Y') . PHP_EOL;
}
08.06.2024 15.06.2024 22.06.2024 29.06.2024

Arbeitstage eines Monats zählen (täglich iterieren)

<?php
$start  = new DateTimeImmutable('2024-03-01');
$end    = new DateTimeImmutable('2024-04-01');
$period = new DatePeriod($start, new DateInterval('P1D'), $end);

$workdays = 0;
foreach ($period as $day) {
    if ((int)$day->format('N') < 6) { // 1=Mo … 5=Fr
        $workdays++;
    }
}

echo "Arbeitstage im März 2024: $workdays";
Arbeitstage im März 2024: 21

Erzeugung über ISO-8601-String (ab PHP 8.3)

<?php
// R3/2024-09-01T00:00:00Z/P1M = 3 Wiederholungen, monatlich ab 01.09.2024
$period = DatePeriod::createFromISO8601String('R3/2024-09-01T00:00:00Z/P1M');

foreach ($period as $date) {
    echo $date->format('d.m.Y') . PHP_EOL;
}
01.09.2024 01.10.2024 01.11.2024 01.12.2024

// Wichtig · Fallstricke

Enddatum ist exklusiv: Das angegebene Enddatum selbst wird nicht in die Iteration einbezogen. Soll der letzte Tag enthalten sein, muss das Enddatum um einen Tick (z. B. +1 day) nach vorne verschoben werden.

Zeitzonenachtung: Bei der Verwendung von Zeitumstellungen (Sommer-/Winterzeit) können Intervalle in Stunden oder Minuten unerwartete Ergebnisse liefern. Es empfiehlt sich, in solchen Fällen UTC-Objekte zu verwenden oder explizit mit DateTimeZone zu arbeiten.

Unveränderlichkeit: DatePeriod selbst ist nach der Erzeugung nicht mehr veränderbar. Für andere Intervalle muss ein neues Objekt erstellt werden.

Ab PHP 8.2 wurde die Klasse so überarbeitet, dass sie sauber IteratorAggregate implementiert; älterer Code, der getStartDate(), getEndDate() oder getDateInterval() nutzt, funktioniert weiterhin.