PHP: Konvertierung deutsches Datum in Timestamp

PHP bietet mehrere Funktionen und Klassen zur Konvertierung eines Datums in eine Timestamp, allerdings scheitern die meisten bei deutschen Datumsangaben - vor allem wenn diese womöglich auch noch den Monatsnamen ausgeschrieben enthalten.

In meinem konkreten Fall ging es darum, Datums-/Zeitangaben im Format “Freitag, 13. Februar 2015 12:20” in eine auch in PHP brauchbare Form zu konvertieren. Nachdem ich mich ewig mit DateTime::createFromFormat, date_create_from_format und strtotime gespielt habe war ich schon kurz davor die Monatsnamen hardcoded über ein Array umzusetzen und/oder das Datum von Hand zu parsen, was mir aber aus prinzipiellen Gründen missfällt.

Die Lösung fand sich dann in einem Kommentar zur Funktion strptime, diese scheint die einzige der Datumskonvertierungen zu sein, die einen Format-String akzeptiert und über einen vorherigen setlocale()-Aufruf auch auf österreichische (= deutschsprachige) Verhältnisse getrimmt werden kann.

Daraus ergab sich dann folgender Code:

<?php
    $dataDate = 0;
    $dateStr = "Freitag, 13. Februar 2015 12:20";
    setlocale (LC_TIME, "de_DE"); // um deutsche Monatsnamen zu erkennen!

                // strptime liefert schwachsinnigerweise für das Monat 0-11 zurück; das Jahr ab 1900
    if ($myDate = strptime ($dateStr, "%A, %d. %B %Y %R")) {
        extract ($myDate);
        $dataDate = @mktime (intval ($tm_hour), intval ($tm_min), intval ($tm_sec),
                             intval ($tm_mon) + 1, intval ($tm_mday), intval ($tm_year) + 1900);

                // Vorsichtshalber...
        if ($dataDate > 0) {
            print $dateStr . "<br/>\n";
            print strftime ("%A, %d. %B %Y %R", $dataDate) . "<br/>\n";
        }
    }
?>

Siehe auch: setlocale, extract, mktime

(function() { var hostname = window.location.hostname; var new_tab = true; var set_icon = true; for (var links = document.links, i = 0, a; a = links[i]; i++) { if (a.hostname !== hostname) { if (new_tab) a.target = ‘_blank’; if (set_icon) a.innerHTML += ‘‘; } } })();

blogroll