2014-04-20 27 views
5

對不起,如果這是一個愚蠢 - 很多類似的問題,但很明顯,如果我能找到一個確切的答案,我不會問:) :)帶有intl-aware天后綴的PHP日期格式?

注意我來自.net和PHP新手,所以那裏可能是noob規模的錯誤。

我希望能夠輸出例如新的DateTime('2014-01-01 13:15:00')爲: '2014年1月1日星期三下午1:15'(可能 - 非本地化)或'Mercredi 1er Janvier 2014à13h15'(不可能?)。

基本上,似乎沒有等同於PHP的'S'日期格式說明符的ISO格式,也沒有用於strftime的格式?

IntlDateFormatter :: FULL關閉 - 但'1月1日星期三'或'mercredi 1 janvier'不是很好的英語(或法語) - 但它似乎是我能得到的最接近的?如果我不得不這樣做,我可以沒有'上','上'和'上',但是序號後綴會很好。 ('星期三一月' - 這是什麼,開始一首詩?)

我在strftime部分看到one example關於解決這個問題的PHP.net的評論(這似乎表明這是一個問題) - 但是它似乎只是添加了英文後綴,這似乎沒有多大用處?我想要一個簡單的方法,它需要一個UTC日期時間,一個語言環境和一個時區,並輸出一個本地化的字符串 - 最好以「正確」的人類可讀格式(如上所述)儘可能使用英文。我想實現這個沒有寫入世界上每種語言的格式字符串。如果它在我的Windows開發盒以及* nix生產盒上工作,它也會很好。

<?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'); 
?> 

回答

0

這個問題的完整的部分 - 包括完整的語法易讀性 - 將是非常困難的,而不要麼做,就像你說的,在世界上書寫的格式字符串每一種語言,或發現包含這樣的庫字符串。 MomentJs似乎提供了很好的intl支持,但在粗略搜索後,我一直無法找到除intl擴展名外的PHP等價物。

你可以得到通過使用IntlDateFormatter和NumberFormatter的組合,首先使用的NumberFormatter提供一個國際化的形式,包括基於序數以獲取日期的序數後綴/前綴模式的階段:

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

然後,您可以創建一個IntlDateFormatter,使您可以檢索目標語言的完整的日期格式的模式:

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

最後,你需要更換部分在$ d atePattern表示與轉義序天圖案天:

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

。注意,通過IntlDateFormatter所使用的圖案與通常的PHP日期格式格式代碼不同,here是用於識別的代碼的文檔。

警告;在相當嚴格標準化的國際化格式中,序號看起來不合適。例如,在中國,格式是:

y年M月d日EEEE 

和插入存在書面中國的前一天值可能看起來很奇怪的中國讀者的序前綴。