Signatur
Beschreibung
DateInvalidOperationException ist eine spezialisierte Ausnahme, die seit PHP 8.3 geworfen wird, wenn eine Datum-/Uhrzeit-Operation technisch nicht durchführbar ist – zum Beispiel wenn versucht wird, von einem DateTime-Objekt, das keine konkretes Datum repräsentiert, einen Zeitraum zu subtrahieren.
Die Klasse erweitert DateException, die wiederum von RuntimeException erbt. Dadurch lässt sie sich sowohl gezielt als DateInvalidOperationException als auch allgemeiner als DateException oder RuntimeException abfangen.
Typischer Auslöser ist das Subtrahieren eines DateInterval, der einen Monat oder ein Jahr enthält, von einem DateTime-Objekt, welches aus einem reinen Zeitstring erzeugt wurde und daher kein vollständiges Datum besitzt. In solchen Situationen kann PHP die Arithmetic nicht sinnvoll auflösen und wirft diese Ausnahme.
Durch das explizite Abfangen dieser Ausnahme können Anwendungen gezielt auf ungültige Kalenderoperationen reagieren, ohne allgemeine Laufzeitfehler zu maskieren.
Beispiele
DateInvalidOperationException abfangen
<?php
try {
// DateTime aus reinem Zeitstring – kein vollständiges Datum
$time = new DateTimeImmutable('12:00:00');
// Versuch, einen Monat zu subtrahieren (nicht unterstützt ohne volles Datum)
$result = $time->sub(new DateInterval('P1M'));
echo $result->format('Y-m-d H:i:s');
} catch (DateInvalidOperationException $e) {
echo 'Ungültige Datumsoperation: ' . $e->getMessage();
} catch (DateException $e) {
echo 'Allgemeiner Datumsfehler: ' . $e->getMessage();
}
Klassenvererbung prüfen und gezielt behandeln
<?php
function subtractInterval(DateTimeImmutable $dt, DateInterval $interval): DateTimeImmutable
{
try {
return $dt->sub($interval);
} catch (DateInvalidOperationException $e) {
// Fallback: Interval ignorieren und Original zurückgeben
trigger_error(
'Subtraktion nicht möglich: ' . $e->getMessage(),
E_USER_WARNING
);
return $dt;
}
}
$date = new DateTimeImmutable('2024-06-15');
$interval = new DateInterval('P2M');
$result = subtractInterval($date, $interval);
echo $result->format('Y-m-d');
// Wichtig · Fallstricke
Neu in PHP 8.3: Vor PHP 8.3 gaben DateTime::sub() und DateTimeImmutable::sub() im Fehlerfall false zurück oder erzeugten eine Warning, ohne eine Ausnahme zu werfen. Bestehendem Code, der auf false-Rückgaben prüft, muss entsprechend angepasst werden, wenn auf PHP 8.3+ migriert wird.
Da DateInvalidOperationException von DateException erbt, genügt es in vielen Fällen, nur DateException abzufangen, wenn keine unterschiedliche Behandlung verschiedener Datumsfehler nötig ist.