Start · Sprachen · PHP · Referenz · DateRangeError

DateRangeError

Klasse

Wird geworfen, wenn ein Datumsobjekt ein Datum außerhalb des auf 32-Bit-Plattformen darstellbaren Unix-Timestamp-Bereichs repräsentiert.

seit PHP 8.3.0 Kategorie: error

Signatur

class DateRangeError extends RangeError

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;
}
DateRangeError: The datetime 2100-01-01 00:00:00 cannot be represented as a Unix timestamp on this platform

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;
}
Kein Timestamp verfügbar (Plattformlimit überschritten).

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