Start · Sprachen · PHP · Referenz · date_create_immutable_from_format

date_create_immutable_from_format

Funktion

Erstellt ein <code>DateTimeImmutable</code>-Objekt aus einer Zeitzeichenkette, die gemäß dem angegebenen Format geparst wird.

seit PHP 5.5.0 Kategorie: date

Signatur

date_create_immutable_from_format(string $format, string $datetime, ?DateTimeZone $timezone = null): DateTimeImmutable|false

Beschreibung

date_create_immutable_from_format() ist die prozedurale Entsprechung von DateTimeImmutable::createFromFormat(). Sie analysiert eine Datums-/Zeitzeichenkette anhand eines angegebenen Formats und gibt bei Erfolg ein unveränderliches DateTimeImmutable-Objekt zurück. Im Gegensatz zu date_create_from_format(), das ein DateTime-Objekt liefert, ist das zurückgegebene Objekt hier unveränderlich (immutable), d. h. jede Modifikation erzeugt eine neue Instanz, anstatt das bestehende Objekt zu verändern.

Der Parameter $format verwendet dieselben Format-Zeichen wie date(). Dies ermöglicht eine präzise Kontrolle darüber, wie die Eingabezeichenkette interpretiert wird – besonders nützlich, wenn Datumswerte aus Formularen, Datenbanken oder externen APIs eingelesen werden, die ein festes, bekanntes Format verwenden.

Die Verwendung von DateTimeImmutable wird gegenüber DateTime in der Regel empfohlen, da sie unerwartete Seiteneffekte verhindert – insbesondere beim Weitergeben von Objekten an Funktionen oder beim Arbeiten mit mehreren abgeleiteten Zeitpunkten.

Falls das Parsing fehlschlägt, gibt die Funktion false zurück. Mit DateTimeImmutable::getLastErrors() können detaillierte Fehlermeldungen und Warnungen abgerufen werden.

Parameter

Name Typ Default Beschreibung
$format Pflicht string Das Format, in dem $datetime übergeben wird. Verwendet dieselben Format-Zeichen wie date(), z. B. 'd.m.Y', 'Y-m-d H:i:s' oder 'U' für Unix-Timestamps.
$datetime Pflicht string Die Datums-/Zeitzeichenkette, die gemäß $format geparst werden soll, z. B. '25.12.2024' oder '2024-12-25 08:30:00'.
$timezone ?DateTimeZone null Optionales DateTimeZone-Objekt, das die Zeitzone des erzeugten Datums festlegt. Wird null übergeben oder weggelassen, wird die aktuelle Standard-Zeitzone verwendet (gemäß date_default_timezone_get()). Enthält $datetime bereits Zeitzoneninformationen, wird dieser Parameter ignoriert.

Rückgabewert

Typ
DateTimeImmutable|false
Beschreibung
Gibt bei Erfolg ein DateTimeImmutable-Objekt zurück, das den geparsten Zeitpunkt repräsentiert. Im Fehlerfall (ungültiges Format oder nicht parsbare Zeichenkette) wird false zurückgegeben.

Beispiele

Datum aus deutschem Format einlesen

<?php
$datum = date_create_immutable_from_format('d.m.Y', '25.12.2024');

if ($datum === false) {
    echo 'Ungültiges Datum!';
} else {
    echo $datum->format('Y-m-d'); // ISO-Format ausgeben
}
2024-12-25

Datum mit Uhrzeit und Zeitzone parsen

<?php
$tz = new DateTimeZone('Europe/Berlin');
$datetime = date_create_immutable_from_format(
    'Y-m-d H:i:s',
    '2024-06-15 14:30:00',
    $tz
);

if ($datetime !== false) {
    echo $datetime->format('d.m.Y H:i T');
}
15.06.2024 14:30 CEST

Fehlerbehandlung bei ungültigem Format

<?php
$result = date_create_immutable_from_format('Y-m-d', '32.13.2024');

if ($result === false) {
    $errors = DateTimeImmutable::getLastErrors();
    echo 'Fehler: ' . implode(', ', $errors['errors']) . PHP_EOL;
    echo 'Warnungen: ' . implode(', ', $errors['warnings']);
}
Fehler: The separated value 2024 does not match any of the allowed values: 1-12 Warnungen:

Unveränderlichkeit von DateTimeImmutable demonstrieren

<?php
$original = date_create_immutable_from_format('Y-m-d', '2024-01-01');
$modified = $original->modify('+30 days');

echo $original->format('Y-m-d') . PHP_EOL; // unverändert
echo $modified->format('Y-m-d') . PHP_EOL; // neue Instanz
2024-01-01 2024-01-31

// Wichtig · Fallstricke

Fehlende Zeitangaben: Wenn im Format keine Zeitkomponenten angegeben werden (z. B. nur 'Y-m-d'), werden die fehlenden Werte aus der aktuellen Zeit übernommen – nicht auf 00:00:00 gesetzt. Um Mitternacht zu erhalten, sollte das Format explizit um H:i:s erweitert oder setTime(0, 0, 0) auf dem Ergebnis aufgerufen werden.

Rückgabe prüfen: Der Rückgabewert sollte immer mit === false geprüft werden, nicht mit == false, da ein gültiges Datumsobjekt niemals falsy ist.

Zeitzone-Vorrang: Enthält die Datumszeichenkette bereits eine Zeitzone (z. B. '+02:00' oder 'UTC'), hat diese Vorrang vor dem $timezone-Parameter.

Alternative: Statt der prozeduralen Variante kann direkt DateTimeImmutable::createFromFormat() verwendet werden – beide sind funktional identisch.