Navigation
 Startseite
 Fachbücher
 Anzeigenmarkt
 Forum
 Webmaster News
 Script Newsletter
 Push Meldungen
 Kontakt
 Script Installation
 Php
 Php Tutorials
 Lernpfade
 Webhoster Vergleich
 Impressum

Community-Bereich
 kostenlos Registrieren
 Anmelden
 Benutzerliste

Script Datenbank
 Script Archiv
 Script Top 20
 Screenshots
 Testberichte

Suche
 

Unsere Php Scripts
 Counter Script
 Umfrage Script
 Bilder Upload Script
 Terminverwaltung
 Simple PHP Forum
 RSS Grabber

Tools und Generatoren
 .htpasswd Generator
 md5 Generator
 base64 Generator
 Markdown to HTML
 Colorpicker
 Unix timestamp Tool
 Unit Test Generator
 TLD Liste
 Webkatalog‑Verzeichnis

Artfiles.de
Bietet Serviceorientierte Internetdienstleistungen...
https://www.Artfiles.de
Hosterplus.de
Bekommen Sie Speicherplatz (Webspace), Domains und...
https://www.Hosterplus.de
 
 
 

PHP datefmt_create(): Datum je Sprache formatieren

Sie befinden sich: Home > Php Tutorial > PHP datefmt_create(): Datum...

PHP datefmt_create(): Datum je Sprache formatieren
Veröffentlicht am:
04.09.2026
Hits / Besucher:
9
Sprache:
  Deutsch
Tutorial Art:
eigenes
Eingetragen von:
Merkliste:
 
Beschreibung

Ein Shop zeigt Liefertermine in drei Sprachen an, und aus Frankreich kommt die Rückmeldung, das Datum sei unlesbar. Kein Wunder: Im Code stehen drei Formatvorlagen und drei von Hand gepflegte Monatsnamen-Listen, und die französische ist unvollständig. Genau dafür gibt es PHP datefmt_create.

Illustration zum Tutorial: PHP datefmt_create(): Datum je Sprache formatieren

Im Bild geht ein einziges Datum in einen Formatierer und kommt in drei Schreibweisen wieder heraus. Genau diese Arbeit übernimmt die Intl-Erweiterung.

Warum date() an Sprachgrenzen scheitert

Die Funktion date() kennt genau eine Sprache. Monats- und Wochentagsnamen kommen immer auf Englisch, unabhängig von jeder Einstellung im System.

<?php

$zeitpunkt = strtotime('2026-08-03');

echo date('l, d F Y', $zeitpunkt);
/* Monday, 03 August 2026 - immer englisch */

$fmt = datefmt_create('de_DE', IntlDateFormatter::FULL, IntlDateFormatter::NONE);
echo datefmt_format($fmt, $zeitpunkt);
/* Montag, 3. August 2026 */

$fmt = datefmt_create('fr_FR', IntlDateFormatter::FULL, IntlDateFormatter::NONE);
echo datefmt_format($fmt, $zeitpunkt);
/* lundi 3 aout 2026 */

Der Unterschied liegt nicht nur im übersetzten Monatsnamen. Im Deutschen steht ein Punkt hinter der Tageszahl, im Französischen fehlt das Komma nach dem Wochentag. Solche Feinheiten pflegt niemand freiwillig von Hand, und PHP datefmt_create nimmt sie einem ab. Das Einlesen technischer Datumsangaben bleibt davon unberührt, dafür ist weiterhin PHP strtotime() zum Parsen von Datumsstrings zuständig.

Was PHP datefmt_create() macht

Der Aufruf von PHP datefmt_create erzeugt einen Formatierer, der anschließend beliebig oft verwendet werden kann. Die Signatur lautet datefmt_create(?string $locale, int $dateType, int $timeType, $timezone = null, $calendar = null, ?string $pattern = null).

PHP datefmt_create und die Klasse IntlDateFormatter sind dasselbe, nur anders geschrieben. Dieses Tutorial nutzt durchgängig die Funktionsform, weil sie kompakter ist; wer lieber Objekte erzeugt, ersetzt den Aufruf einfach durch new IntlDateFormatter(...) mit denselben Argumenten.

Voraussetzung ist die Intl-Erweiterung. Sie ist auf den meisten Servern vorhanden, aber nicht auf allen, weshalb der letzte Abschnitt eine Rückfallebene zeigt.

Die sechs Parameter im Original, so wie sie im Handbuch stehen:

datefmt_create(?string $locale, int $dateType, int $timeType,

$timezone = null, $calendar = null,
?string $pattern = null): ?IntlDateFormatter

/* locale - the locale to use, e.g. de_DE
dateType - the date formatting style, FULL to SHORT or NONE
timeType - the time formatting style, same set of constants
timezone - the timezone to use for this date formatter only
calendar - GREGORIAN by default, or an IntlCalendar object
pattern - an optional pattern, overrides both style values
return - the formatter object, or null on failure

Example: a value formatted with FULL and de_DE reads
"Montag, 3. August 2026". The same value in en_US reads
"Monday, August 3, 2026", and December 31 stays December 31. */

Der Hinweis zum vierten Parameter ist der wichtigste der Liste: Die Zeitzone gilt nur für diesen einen Formatierer und ändert nichts an der Einstellung der Anwendung.

Die vier Längen von PHP datefmt_create()

Die beiden ersten Zahlenwerte bestimmen, wie ausführlich Datum und Uhrzeit ausfallen. Sie lassen sich frei kombinieren, und NONE lässt den jeweiligen Teil ganz weg.

Konstante Datum auf Deutsch Uhrzeit auf Deutsch
FULLMontag, 3. August 202614:30:00 Mitteleuropäische Sommerzeit
LONG3. August 202614:30:00 MESZ
MEDIUM03.08.202614:30:00
SHORT03.08.2614:30
NONEwird weggelassenwird weggelassen

Für ein Datum ohne Uhrzeit steht also FULL im zweiten und NONE im dritten Argument. Wer beide auf NONE setzt, bekommt eine leere Ausgabe, es sei denn, es folgt ein eigenes Muster.

Eigene Muster mit ICU-Zeichen

Die vier Längen treffen selten genau den Wunsch. Der sechste Parameter von PHP datefmt_create nimmt dafür ein eigenes Muster entgegen. Achtung an dieser Stelle: die Musterzeichen sind nicht dieselben wie bei date().

Zeichen Bedeutung Beispiel
yyyyJahr vierstellig2026
MM / MMMMMonat zweistellig / ausgeschrieben08 / August
d / ddTag ohne / mit führender Null3 / 03
EEEEWochentag ausgeschriebenMontag
HH:mmStunde und Minute, 24 Stunden14:30
zZeitzone kurzMESZ
<?php

$fmt = datefmt_create(
'de_DE',
IntlDateFormatter::NONE,
IntlDateFormatter::NONE,
'Europe/Berlin',
null,
"EEEE, d. MMMM yyyy 'um' HH:mm 'Uhr'"
);

echo datefmt_format($fmt, strtotime('2026-08-03 14:30'));
/* Montag, 3. August 2026 um 14:30 Uhr */

Feste Wörter im Muster gehören in einfache Anführungszeichen, sonst werden ihre Buchstaben als Musterzeichen gelesen. Ohne die Anführungszeichen um "um" würde das m zur Minutenangabe.

Die Zeitzone in PHP datefmt_create() setzen

Der vierte Parameter wirkt nur für diesen einen Formatierer. Die Standardzeitzone der Anwendung bleibt unberührt, was praktisch ist, aber gern übersehen wird.

<?php

$abflug = strtotime('2026-08-03 14:30 UTC');

$berlin = datefmt_create('de_DE', IntlDateFormatter::NONE,
IntlDateFormatter::SHORT, 'Europe/Berlin');
$bangkok = datefmt_create('de_DE', IntlDateFormatter::NONE,
IntlDateFormatter::SHORT, 'Asia/Bangkok');

echo datefmt_format($berlin, $abflug); /* 16:30 */
echo datefmt_format($bangkok, $abflug); /* 21:30 */

Derselbe Zeitpunkt, zwei Anzeigen. Wer stattdessen mit date_default_timezone_set() arbeitet, ändert das Verhalten der gesamten Anwendung und bekommt an anderer Stelle unerwartete Ergebnisse. Wie sich Zeitzonen im Rechenweg selbst sauber behandeln lassen, zeigt PHP DateTimeZone zum sicheren Umgang mit Zeitzonen.

Vom veralteten strftime() umstellen

Seit PHP 8.1 ist strftime() als veraltet markiert und erzeugt eine entsprechende Meldung. Es funktioniert vorerst weiter, wird aber in einer der nächsten Hauptversionen verschwinden. Die Umstellung ist überschaubar, weil sich die Platzhalter direkt übersetzen lassen.

strftime() ICU-Muster Bedeutung
%dddTag
%mMMMonat
%YyyyyJahr
%BMMMMMonatsname
%AEEEEWochentag
%H:%MHH:mmUhrzeit

Der zweite Unterschied fällt beim Umstellen sofort auf: strftime() brauchte ein vorher gesetztes setlocale(), dessen Wirkung vom Betriebssystem abhing. Die Sprache steht hier direkt im Aufruf und verhält sich auf jedem Server gleich.

DateTime-Objekte direkt formatieren

Wer mit DateTimeImmutable arbeitet, braucht keinen Umweg über den Zeitstempel.

<?php

$termin = new DateTimeImmutable('2026-08-03 14:30', new DateTimeZone('Europe/Berlin'));

$fmt = datefmt_create('de_DE', IntlDateFormatter::LONG, IntlDateFormatter::SHORT);
echo datefmt_format($fmt, $termin);
/* 3. August 2026 um 14:30 */

Die Funktion nimmt jeden Wert entgegen, der DateTimeInterface umsetzt. Der Umweg über getTimestamp() ist nicht nur unnötig, er verliert bei Objekten mit eigener Zeitzone auch Information.

Datum aus Text einlesen

Die Gegenrichtung fehlt in den meisten Beiträgen, ist aber genauso wichtig. Formulareingaben kommen in der Schreibweise des jeweiligen Landes an, und strtotime() versteht davon nur die englische.

<?php

$fmt = datefmt_create('fr_FR', IntlDateFormatter::LONG, IntlDateFormatter::NONE);

$zeit = datefmt_parse($fmt, '3 aout 2026');

if (datefmt_get_error_code($fmt) !== 0) {
exit('Eingabe nicht verstanden: ' . datefmt_get_error_message($fmt));
}

echo date('Y-m-d', $zeit); /* 2026-08-03 */

Die Fehlerprüfung ist Pflicht, denn ein fehlgeschlagener Leseversuch mit PHP datefmt_create liefert false, und false lässt sich von einem Zeitstempel mit dem Wert null nicht unterscheiden. Nur der Fehlercode gibt eine eindeutige Auskunft. Ob das eingelesene Datum überhaupt existiert, beantwortet danach PHP checkdate() zur Prüfung auf ein gültiges Datum.

Andere Kalender

Nicht überall gilt der gregorianische Kalender. Die Umstellung erfolgt bei PHP datefmt_create über die Sprachangabe selbst, ohne dass sich am übrigen Code etwas ändert.

<?php

$fmt = datefmt_create('de_DE@calendar=islamic', IntlDateFormatter::LONG,
IntlDateFormatter::NONE, null, IntlDateFormatter::TRADITIONAL);

echo datefmt_format($fmt, strtotime('2026-08-03'));
/* 19. Safar 1448 AH */

Nach demselben Muster funktionieren unter anderem der persische und der buddhistische Kalender. Der fünfte Parameter muss dabei auf TRADITIONAL stehen, sonst rechnet die Erweiterung weiter gregorianisch. Er nimmt alternativ ein IntlCalendar-Objekt entgegen, womit sich auch Wochenbeginn und Zeitzone eines Kalenders einzeln festlegen lassen.

flowchart TD
  A[Datum ausgeben] --> B{Liest ein Mensch}
  B -->|nein| C[date mit festem Format]
  B -->|ja| D{Standardlaenge passt}
  D -->|ja| E[datetype und timetype]
  D -->|nein| F[Eigenes ICU-Muster]
  E --> G[Zeitzone pruefen]
  F --> G[Zeitzone pruefen]

Der linke Zweig ist wichtig: Für Datenbankfelder, Dateinamen und Schnittstellen bleibt das feste technische Format richtig, weil es sich nie ändern darf.

Wenn die Intl-Erweiterung fehlt

Auf einfachen Hosting-Paketen ist die Erweiterung gelegentlich nicht aktiv. Statt das Skript abstürzen zu lassen, lässt sich die Ausgabe kapseln.

<?php

function datumLang(int $zeitpunkt): string
{
if (extension_loaded('intl')) {
$fmt = datefmt_create('de_DE', IntlDateFormatter::LONG,
IntlDateFormatter::NONE, 'Europe/Berlin');

return (string) datefmt_format($fmt, $zeitpunkt);
}

$monate = [1 => 'Januar', 'Februar', 'Maerz', 'April', 'Mai', 'Juni',
'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'];

return (int) date('j', $zeitpunkt) . '. '
. $monate[(int) date('n', $zeitpunkt)] . ' '
. date('Y', $zeitpunkt);
}

Der Aufrufer merkt vom Unterschied nichts. Die Rückfallebene deckt nur die eigene Sprache ab, was in aller Regel genügt, denn ohne die Erweiterung ist Mehrsprachigkeit ohnehin nicht sinnvoll umsetzbar.

Ein letzter Hinweis zur Geschwindigkeit: Das Erzeugen des Formatierers lädt Sprachdaten und ist der aufwendige Teil, das Formatieren selbst ist billig. In einer Schleife über tausend Zeilen gehört PHP datefmt_create deshalb vor die Schleife, nicht hinein.

Fazit

Mit PHP datefmt_create hängt die Schreibweise eines Datums nicht mehr am Code, sondern an der Sprachangabe. Vier Längen decken den Alltag ab, eigene Muster den Rest, und die Zeitzone ist ein Parameter statt einer globalen Einstellung. Wer noch strftime() im Bestand hat, findet in der Umstellungstabelle oben den kompletten Weg. Und wer die Musterzeichen einmal mit denen von date() verwechselt hat, vergisst den Unterschied so schnell nicht wieder.

 

Tags:

 

 

Kommentare (0)

Noch keine Kommentare. Sei der Erste!

Melde dich an, um einen Kommentar zu schreiben.
Bücherregal mit drei Büchern: 'PHP 4 - Grundlagen und Profiwissen' von Hanser Verlag, 'Webdesign in a Nutshell' von O'Reilly Verlag, und 'Webgestaltung' von Galileo Computing.