Datum formatieren in PHP

Veröffentlicht am Montag, den 12. September 2022

Der Artikel ist veraltet und wird für zukünftige PHP-Versionen nicht mehr funktionieren. Siehe den neuen Artikel.

Einführung

In PHP kann man ganz einfach einen vorgegebenen String, welches ein Datum enthält, so umwandeln, dass er für einen Nutzer einfach zu lesen ist. Auch kann man damit den Wochentag automatisch bestimmen und sogar die Sprache des formatierten Datums einstellen. Ich gehe davon aus, dass der übergebene String kein sauberer String mit Datum ist, sondern neben dem Datum auch noch weitere Informationen enthält. Diesen gilt es dann vorzubereiten, bevor er in PHP-Funktionen übergeben werden kann.

Funktion

Zuerst schreiben wir eine Funktion format_date, die einen String akzeptiert und das Datum im gewünschten Format zurückgibt.

function format_date($str) {
  preg_match('/(\d.*)/', $str, $matches);
  $date = explode('-', $matches[1]);
  array_splice($date, 3);
  $date = implode('/', $date);

  setlocale(LC_TIME, 'de_DE', 'de_DE.UTF-8');
  return strftime('%A, %e. %b %Y', strtotime($date));
  }

Gehen wir das Ganze Schritt für Schritt durch.

  1. Wir verwenden REGEX, um alle Ziffern aus dem String herauszunehmen. Der Regex matcht Wörter, die mit einer Zahl beginnen und egal wie lang sein können. Das ist damit man z.B. bei einem String, welcher zusätzlich noch einen Pfad enthält und diesen herausfiltert. Die Datei hier heißt z.B. /articles/2022-09-12-datum-formatieren-in-php.php und ich möchte nur den Namen erhalten.

  2. Als nächstes wird der gematchte String bei '-' getrennt. Man erhält also z.B. bei 2022-02-28 ein Array mit den Stringelementen [2022, 02, 28].

  3. Die nächste Zeile ist auch nicht zwingend notwendig, wenn man ganz sicher einen 'sauberen' Datum-String erhält. (Dann wären aber theoretisch auch nur die letzten zwei Zeilen wichtig). Es werden hier nämlich nur die ersten drei Elemente (Also Jahr, Monat, Tag) übrig gelassen. Alle anderen Elemente werden herausgenommen.

  4. Das Datum ist dann nach der dritt-letzten Zeile bereit zum Formatieren für den Nutzer. Hier wird aus dem Array ein String gemacht. Aus [2022, 02, 28] wird '2022/02/28'.

  5. Mit setlocale sagen wir PHP in welcher Sprache die Zeit bzw. ein Datum ausgegeben werden soll. Abhängig von der Sprache hat das nämlich auf die Ausgabe des Datums einen sehr großen Unterschied. Siehe setlocale() Dokumentation für mehr Informationen.

  6. Damit strftime() funktioniert, wird ein Unix-Zeitstempel benötigt. Das können wir der Funktion liefern, indem wir aus unserem String nun den Zeitstempel mit strtotime() erstellen. Die Funktion strtotime() wandelt nicht nur z.B. 2022-02-28 um, sondern auch now oder last Monday. Also eine auf Englisch gestellte Datums- und Zeitbeschreibung kann zu einem gültigen Unix-Zeitstempel umgewandelt werden. Siehe strtotime() Dokumentation für mehr Informationen.

    Haben wir den Zeitstempel, können wir uns dem ersten Parameter der strftime() Funktion widmen. Der erste Parameter ist ein Platzhalter-String für die gewünschte Ausgabe. Hier steht %A, %e. %b %Y für den Wochentag gefolgt von einem Komma und Leerzeichen, dann der Tag im Monat gefolgt von einem Punkt und Leerzeichen. Dann noch der Monat und das Jahr in YYYY Schreibweise. Der Platzhalter-String ist demzufolge extrem flexibel, was die Darstellung des Zeitstempels angeht. Siehe strftime() Dokumentation für alle möglichen Formate. Das formatierte Datum wird letztlich zurückgegeben.

Ausgabe

Diese Funktion können wir nun benutzen:

$date = '2022-02-28';
echo format_date($date);
#Ausgabe: Montag, 28. Feb 2022

Bei 2022-02-28 ist die Ausgabe Montag, 28. Feb 2022.

Fazit

Wie wir gesehen haben, kann man sehr einfach mit PHP ein Datum in einer bestimmten Sprache formatieren. Die Funktionen strftime() und strtotime() sind hier ausschlaggebend. Man kann das Ganze noch erweitern und mit Uhrzeiten arbeiten. Aber hier ging es nur darum ein Datum zu formatieren. 😉


Anmerkung:
strftime() gilt seit PHP 8.1.0 als veraltet und sollte nicht mehr verwendet werden. Link zum neuen Artikel.