Start · Sprachen · PHP · Referenz · date_sub

date_sub

Funktion

Subtrahiert ein <code>DateInterval</code> von einem <code>DateTime</code>-Objekt und gibt das modifizierte Objekt zurück.

seit PHP 5.3.0 Kategorie: date

Signatur

date_sub(DateTime $object, DateInterval $interval): DateTime|false

Beschreibung

date_sub() ist die prozedurale Entsprechung der Methode DateTime::sub(). Sie zieht einen durch ein DateInterval-Objekt definierten Zeitraum vom übergebenen DateTime-Objekt ab und modifiziert dieses direkt. Das veränderte Objekt wird ebenfalls als Rückgabewert zurückgegeben.

Die Funktion eignet sich überall dort, wo man ohne objektorientierte Schreibweise arbeiten möchte, aber dennoch komfortable Datumsarithmetik benötigt – etwa beim Berechnen von Ablaufdaten, Fristen oder historischen Zeitpunkten.

Das DateInterval-Objekt wird meist mit new DateInterval('P...') oder DateInterval::createFromDateString() erzeugt. Die ISO-8601-Dauer-Notation (z. B. P1Y2M3DT4H5M6S) erlaubt dabei eine sehr genaue Spezifikation des abzuziehenden Zeitraums.

Zu beachten ist, dass date_sub() das übergebene DateTime-Objekt direkt verändert (Mutation). Wer ein unveränderliches Datum benötigt, sollte stattdessen DateTimeImmutable zusammen mit DateTimeImmutable::sub() verwenden.

Parameter

Name Typ Default Beschreibung
$object Pflicht DateTime Das DateTime-Objekt, von dem der Zeitraum abgezogen wird. Das Objekt wird dabei direkt verändert.
$interval Pflicht DateInterval Ein DateInterval-Objekt, das den abzuziehenden Zeitraum beschreibt. Erstellt z. B. mit new DateInterval('P1Y') für ein Jahr.

Rückgabewert

Typ
DateTime|false
Beschreibung
Gibt das modifizierte DateTime-Objekt zurück. Im Fehlerfall wird false zurückgegeben, was in der Praxis jedoch selten vorkommt, wenn die Parameter korrekt sind.

Beispiele

30 Tage von einem Datum abziehen

<?php
$datum = date_create('2024-03-15');
$interval = new DateInterval('P30D'); // 30 Tage
$ergebnis = date_sub($datum, $interval);

echo date_format($ergebnis, 'Y-m-d'); // Gibt das modifizierte Datum aus
2024-02-14

Kombinierter Zeitraum subtrahieren (1 Jahr, 2 Monate, 3 Tage)

<?php
$datum = date_create('2025-06-01 12:00:00');
$interval = new DateInterval('P1Y2M3D'); // 1 Jahr, 2 Monate, 3 Tage
date_sub($datum, $interval);

echo date_format($datum, 'd.m.Y H:i:s');
29.03.2024 12:00:00

Ablaufdatum berechnen (Cookie vor 7 Tagen abgelaufen?)

<?php
$heute = date_create('now');
$grenze = date_sub(date_create('now'), new DateInterval('P7D'));

$cookieDatum = date_create('2025-01-01');

if ($cookieDatum < $grenze) {
    echo 'Cookie ist vor mehr als 7 Tagen abgelaufen.';
} else {
    echo 'Cookie ist noch gültig oder erst kürzlich abgelaufen.';
}
Cookie ist vor mehr als 7 Tagen abgelaufen.

// Wichtig · Fallstricke

Mutation beachten: date_sub() verändert das übergebene DateTime-Objekt direkt. Wenn das ursprüngliche Datum erhalten bleiben soll, muss vorher eine Kopie mit clone $datum erstellt werden.

Für unveränderliche Datumsobjekte sollte DateTimeImmutable mit der Methode DateTimeImmutable::sub() bevorzugt werden, da sie immer ein neues Objekt zurückgibt und keine Nebeneffekte verursacht.

Die Subtraktion von Monaten kann zu unerwarteten Ergebnissen führen, wenn das Zieldatum keinen entsprechenden Tag besitzt (z. B. 31. März minus 1 Monat ergibt den 3. März, da der 31. Februar nicht existiert). Dieses Verhalten ist PHP-spezifisch und sollte in kritischen Berechnungen geprüft werden.