2014-04-20 5 views
5

Sorry, wenn das ein Dupe ist - viele ähnliche Fragen, aber natürlich, wenn ich eine genaue Antwort finden könnte, würde ich nicht fragen :)PHP Datumsformat mit Intl-Aware Tag Suffix?

Hinweis Ich komme aus .Net und bin ein PHP-Neuling, also dort möglicherweise Noob-Skala Fehler.

Ich möchte in der Lage sein, z. new DateTime ('2014-01-01 13:15:00') as: 'Mittwoch, der 1. Januar 2014 um 13:15' (möglich - nicht lokalisierte) oder 'Mercredi 1er Janvier 2014 um 13:15' (nicht möglich ?).

Grundsätzlich scheint es keine ISO-Formatierung zu geben, die dem Datumsformat-Spezifizierer von PHP entspricht, noch gibt es eine für strftime? Der IntlDateFormatter :: FULL kommt zu nahe - aber 'Mittwoch, 1. Januar' oder 'mercredi 1 Janvier' ist nicht gut Englisch (oder Französisch) - aber es scheint das nächste zu sein, was ich bekommen kann?

Ich könnte ohne 'on', 'the' und 'at' leben, wenn ich müsste, aber Ordinal-Suffixe wären nett. ('Mittwoch ein Januar' - was ist das, der Anfang zu einem Gedicht?)

Ich sah one example auf der Strftime Abschnitt Kommentare zu PHP.net Adressierung dieses Problems (was scheint, dass es ein Problem ist) - jedoch Es schien nur die englischen Suffixe hinzuzufügen, die nicht viel brauchten. Ich möchte eine einfache Methode, die eine UTC-Datetime, ein Gebietsschema und eine Zeitzone verwendet und eine lokalisierte Zeichenkette ausgibt - vorzugsweise im "richtigen" lesbaren Format (wie oben), wie es in Englisch möglich ist. Ich möchte dieses ohne erreichen, das eine Formatzeichenkette für jede Sprache in der Welt schreibt. Es wäre auch schön, wenn es auf meiner Windows-Dev-Box sowie der * nix-Production-Box funktioniert.

<?php 
$utcdate = new DateTime('2014-01-01 13:15:00', new DateTimeZone('UTC')); 
echo $utcdate->format('l \t\h\e jS \o\f F Y \a\t g:ia') . "<br>"; 
function dumpDates($date, $locale, $tz){ 
    $date->setTimeZone(new DateTimeZone($tz)); 
    $fmt = new IntlDateFormatter($locale, IntlDateFormatter::FULL, IntlDateFormatter::FULL, 
     $tz, IntlDateFormatter::GREGORIAN ); 
    echo $fmt->format($date) . "<br>"; 
    // doesn't work under windows? 
    setLocale(LC_TIME, $locale); 
    echo strftime('%A, %#d %B %Y %I:%M:%S %p', $date->getTimeStamp()) . "<br>"; 

} 
dumpDates($utcdate, 'en_GB', 'Europe/London'); 
dumpDates($utcdate, 'de_DE', 'Europe/Berlin'); 
dumpDates($utcdate, 'fr_FR', 'Europe/Paris'); 
?> 

Antwort

0

Der vollständige Teil dieser Frage - in voller grammatischer Lesbarkeit einschließlich - wäre sehr schwierig, ohne entweder zu tun, wie Sie sagen, ein Format-String für jede Sprache der Welt zu schreiben, oder eine Bibliothek zu finden, das eine solche enthält Saiten. MomentJs scheint große Intl-Unterstützung zu bieten, aber nach einer oberflächlichen Suche konnte ich kein anderes PHP-Äquivalent als die intl-Erweiterung finden.

Sie auf die Stufe der Bereitstellung eines internationalisierten Form einschließlich Ordnungsbasierte Zahl bekommen konnte, indem zuerst NumberFormatter eine Kombination aus IntlDateFormatter und NumberFormatter, unter Verwendung der Muster für das Datum des Ordnungs Suffix/Präfix zu erhalten:

$numFmt = new NumberFormatter('fr_FR', NumberFormatter::ORDINAL); 
$ordinalDay = $numFmt->format($date->format('j')); 

Sie könnten dann eine IntlDateFormatter erstellen, die Sie das Muster für das Volldatumsformat der Zielsprache abrufen können:

$dateFormat = new IntlDateFormatter('fr_FR', IntlDateFormatter::FULL, IntlDateFormatter::FULL, $tz, IntlDateFormatter::GREGORIAN); 
$datePattern = $dateFormat->getPattern(); 

Schließlich würde, müssen Sie den Abschnitt in der $ d ersetzen atePattern, die den Tag mit den Ordnungs Tag Muster entkommen:

$datePattern = preg_replace('/d+', "'"+$ordinalDay+"'", $datePattern); 
$dateFormat->setPattern($datePattern); 
$outputDate = $dateFormat->format($date); 

Beachten Sie, dass die von IntlDateFormatter verwendeten Mustern von dem üblichen PHP Datumsformatierung Format-Codes unterscheiden, ist here die Dokumentation zu den anerkannten Regeln.

Eine Warnung; In internationalisierten Formaten, die ziemlich streng standardisiert sind, würde eine Ordnungszahl fehl am Platz erscheinen.Zum Beispiel in Chinesisch, das Format ist:

y年M月d日EEEE 

und den Ordnungs Präfix eingefügt, die für die geschriebenen Chinesisch existiert, bevor der Tag-Wert auf einen chinesischen Leser seltsam aussehen kann.