Start · Sprachen · PHP · Referenz · DateTimeInterface

DateTimeInterface

Interface

Gemeinsames Interface für <code>DateTime</code> und <code>DateTimeImmutable</code>, das einheitliche Typ-Deklarationen für beide Klassen ermöglicht.

seit PHP 5.5.0 Kategorie: date

Signatur

interface DateTimeInterface

Beschreibung

DateTimeInterface wurde eingeführt, um in Typ-Deklarationen (Parameter, Rückgabewerte, Eigenschaften) sowohl DateTime- als auch DateTimeImmutable-Objekte akzeptieren zu können. Damit lassen sich flexible APIs schreiben, die mit beiden Datum-Klassen umgehen können, ohne auf eine bestimmte Implementierung festgelegt zu sein.

Es ist nicht möglich, dieses Interface in eigenem Code zu implementieren. Es ist ausschließlich für die Verwendung in Typ-Deklarationen gedacht. Eigene Datum-Klassen sollten stattdessen entweder DateTime oder DateTimeImmutable erweitern.

Das Interface definiert eine Reihe von Methoden, die beide Klassen gemeinsam haben: format(), getTimestamp(), getTimezone(), getOffset(), diff() sowie die magische Methode __wakeup() und ab PHP 8.0 auch __serialize() und __unserialize(). Durch die Verwendung von DateTimeInterface als Typ kann Code geschrieben werden, der immutabel-sicher oder mutabel arbeitet – je nachdem, welches Objekt übergeben wird.

In der Praxis empfiehlt es sich, in allen öffentlichen APIs DateTimeInterface als Parametertyp zu verwenden und intern DateTimeImmutable zu bevorzugen, um unerwünschte Seiteneffekte durch versehentliche Mutation zu vermeiden.

Beispiele

DateTimeInterface als Parametertyp in einer Funktion

<?php
function formatiereDatum(DateTimeInterface $datum, string $format = 'd.m.Y H:i'): string {
    return $datum->format($format);
}

// Funktioniert mit DateTime ...
$mutableDate = new DateTime('2024-06-15 14:30:00');
echo formatiereDatum($mutableDate) . PHP_EOL;

// ... und mit DateTimeImmutable
$immutableDate = new DateTimeImmutable('2024-06-15 14:30:00');
echo formatiereDatum($immutableDate) . PHP_EOL;
15.06.2024 14:30 15.06.2024 14:30

DateTimeInterface in einer Klassen-Eigenschaft (PHP 8.0+)

<?php
class Termin {
    public function __construct(
        private string $titel,
        private DateTimeInterface $startzeit,
        private DateTimeInterface $endzeit
    ) {}

    public function getDauer(): string {
        $diff = $this->startzeit->diff($this->endzeit);
        return sprintf('%d Stunden, %d Minuten', $diff->h, $diff->i);
    }

    public function __toString(): string {
        return sprintf(
            '%s: %s bis %s',
            $this->titel,
            $this->startzeit->format('d.m.Y H:i'),
            $this->endzeit->format('H:i')
        );
    }
}

$termin = new Termin(
    'Team-Meeting',
    new DateTimeImmutable('2024-06-15 09:00'),
    new DateTimeImmutable('2024-06-15 10:30')
);

echo $termin . PHP_EOL;
echo 'Dauer: ' . $termin->getDauer() . PHP_EOL;
Team-Meeting: 15.06.2024 09:00 bis 10:30 Dauer: 1 Stunden, 30 Minuten

Differenz zweier Datumsobjekte über das Interface

<?php
function tageZwischen(DateTimeInterface $von, DateTimeInterface $bis): int {
    return (int) $von->diff($bis)->days;
}

$start = new DateTimeImmutable('2024-01-01');
$ende  = new DateTime('2024-12-31');

echo 'Tage in 2024: ' . tageZwischen($start, $ende) . PHP_EOL;
Tage in 2024: 365

// Wichtig · Fallstricke

Nicht implementierbar: Eigene Klassen dürfen DateTimeInterface nicht direkt implementieren (implements DateTimeInterface). PHP wirft hierbei einen fatalen Fehler. Stattdessen sollte DateTime oder DateTimeImmutable erweitert werden.

Immutabilität bevorzugen: Da DateTimeInterface sowohl mutable (DateTime) als auch immutable (DateTimeImmutable) Objekte akzeptiert, sollte innerhalb einer Funktion, die DateTimeInterface empfängt, das Objekt niemals modifiziert werden (z. B. durch modify() auf einem DateTime-Objekt), da dies für den Aufrufer unerwartete Seiteneffekte erzeugen kann.

Konstanten: Das Interface definiert die Konstanten DateTimeInterface::ATOM, DateTimeInterface::ISO8601, DateTimeInterface::RFC2822 u. a. für gängige Datumsformate, die direkt genutzt werden können.