Signatur
Beschreibung
DateRangeError ist eine spezialisierte Fehlerklasse, die von RangeError erbt und auf 32-Bit-Plattformen ausgelöst wird, wenn Methoden wie DateTime::getTimestamp(), DateTimeImmutable::getTimestamp() oder die Funktion date_timestamp_get() aufgerufen werden und das zugrundeliegende Datumsobjekt ein Datum repräsentiert, das außerhalb des vorzeichenbehafteten 32-Bit-Integer-Bereichs (ca. 1901–2038) liegt.
Auf 64-Bit-Plattformen tritt dieser Fehler in der Regel nicht auf, da dort der Timestamp-Bereich deutlich größer ist. Er ist daher besonders relevant für Anwendungen, die auf älteren oder eingebetteten 32-Bit-Systemen betrieben werden und mit historischen oder weit zukünftigen Datumsangaben arbeiten.
Da DateRangeError die Error-Hierarchie nutzt (und nicht Exception), muss er mit einem entsprechenden catch(Error $e)- oder spezifischen catch(DateRangeError $e)-Block abgefangen werden. Er sollte nicht mit dem veralteten Verhalten verwechselt werden, bei dem frühere PHP-Versionen in solchen Fällen false zurückgaben oder stille Fehler erzeugten.
Die Klasse selbst besitzt keine eigenen Methoden oder Eigenschaften – alle relevanten Informationen (Meldung, Code, Datei, Zeile) werden über die geerbten Methoden von Throwable bereitgestellt.
Beispiele
DateRangeError auf 32-Bit-Plattform abfangen
<?php
// Dieses Beispiel zeigt das Verhalten auf einer 32-Bit-Plattform.
// Auf 64-Bit-Systemen wird der Fehler typischerweise NICHT geworfen.
$date = new DateTimeImmutable('2100-01-01 00:00:00');
try {
$timestamp = $date->getTimestamp();
echo "Timestamp: " . $timestamp . PHP_EOL;
} catch (DateRangeError $e) {
echo "DateRangeError: " . $e->getMessage() . PHP_EOL;
} catch (Error $e) {
echo "Allgemeiner Fehler: " . $e->getMessage() . PHP_EOL;
}
Plattformunabhängige Absicherung mit date_timestamp_get
<?php
// Sichere Hilfsfunktion, die plattformübergreifend funktioniert
function getTimestampSafe(DateTimeInterface $dt): int|null {
try {
return date_timestamp_get($dt);
} catch (DateRangeError $e) {
// Datum liegt außerhalb des 32-Bit-Bereichs
trigger_error(
'Timestamp nicht darstellbar: ' . $e->getMessage(),
E_USER_WARNING
);
return null;
}
}
$future = new DateTime('2500-06-15');
$result = getTimestampSafe($future);
if ($result === null) {
echo "Kein Timestamp verfügbar (Plattformlimit überschritten)." . PHP_EOL;
} else {
echo "Timestamp: " . $result . PHP_EOL;
}
// Wichtig · Fallstricke
Plattformabhängigkeit: Auf 64-Bit-Systemen werden Unix-Timestamps als 64-Bit-Integer gespeichert, weshalb DateRangeError dort in der Regel nicht auftritt. Code, der auf beiden Plattformen laufen soll, sollte dennoch defensive Fehlerbehandlung einsetzen.
Vererbungshierarchie: DateRangeError extends RangeError extends Error. Ein generischer catch(Exception $e)-Block fängt diesen Fehler nicht ab – es muss Error oder DateRangeError explizit verwendet werden.
Eingeführt in PHP 8.3: Vor PHP 8.3 gaben betroffene Funktionen auf 32-Bit-Plattformen bei Überlauf statt eines Fehlers möglicherweise inkorrekte Werte oder false zurück, was schwerer zu erkennen war.