2012-01-11 18 views
9

非常に単純な問題があります。私はロケール識別子en、en_US、cs_CZなどを持っています。私はちょうどそのロケールの日時フォーマットを取得する必要があります。ロケールに応じてタイムスタンプや日付オブジェクトを簡単にフォーマットできます。しかし、私はちょうど日付形式の文字列表現が必要です、正規表現と言うことができます。この機能を管理する関数はありますか? setlocale()と一緒にPHPのロケールに応じた日付形式を取得

$locale = "en_US"; 
$format = the_function_i_need($locale); 
echo $format; // prints something like "month/day/year, hour:minute" 
+0

@dagonに同意します。 UTCに従うようにPHPを設定すると、ずっと簡単になります。 – ThinkingMonkey

+1

@ダゴン私はあなたのコメントがより正確だと思う、あなたは答えとしてそれを置く必要があります。 –

答えて

2

コメントから変換:

可能性のリストで配列を作成する必要があります。

http://en.wikipedia.org/wiki/Date_format_by_countryが役立ちます。

はどこかに行ってたとき、私はそれは私が同じことを自分でやろうとしている他の人

+0

これは助言ですが、回答はありません – verybadbug

+0

私は答えにコメントを回すように求められました。 –

0

使用strftime():私はすべてのこれまでの...

Exapmleを発見していません。あなたが探しているもののようです。

+0

答えに感謝しますが、それは逆です。そうでなければ、私はあなたの考えに従わない。あなたは簡単な例を書けますか? –

+2

ああ、私は今理解していると思う。 'strftime()'は出力の時間と言語を変換しますが、アルバニアの "dd/mm/yyyy"とは対照的に、カナダの "yyyy-mm-dd"のような実際のフォーマットでは、Dagonのアプローチ。これを行う機能があるはずです... –

2

のために便利になるだろうと確信している機能を投稿してください。すべての国の配列を構築するのではなく、正規表現を使ってフォーマットを決定する方法はありますか?

setlocale(LC_TIME, "us_US"); 

// returns 'mdy' 
$type1 = getDateFormat(); 

setlocale(LC_TIME, "fi_FI"); 

// returns 'dmy' 
$type2 = getDateFormat(); 

setlocale(LC_TIME, "hu_HU"); 

// returns 'ymd' 
$type3 = getDateFormat(); 

/** 
* @return string 
*/ 
function getDateFormat() 
{ 
    $patterns = array(
     '/11\D21\D(1999|99)/', 
     '/21\D11\D(1999|99)/', 
     '/(1999|99)\D11\D21/', 
    ); 
    $replacements = array('mdy', 'dmy', 'ymd'); 

    $date = new \DateTime(); 
    $date->setDate(1999, 11, 21); 

    return preg_replace($patterns, $replacements, strftime('%x', $date->getTimestamp())); 
} 
1
function getDateFormat($locale) 
{ 
    $formatter = new IntlDateFormatter($locale, IntlDateFormatter::SHORT, IntlDateFormatter::NONE); 
    if ($formatter === null) 
     throw new InvalidConfigException(intl_get_error_message()); 

    return $formatter->getPattern(); 
} 

あなたがintlをインストールSHUREしてください。

+0

日付パターンはICUフォーマット – verybadbug

+0

になります。私にとって、これは最良の答えです - 普遍的で、短く働いています。これらのICUフォーマットは、可能性についてかなり短いと思われるが。私はIntlDateFormatter :: SHORTのような4桁の年と先行0を必要とします。 – userfuser

+0

私はマニュアルからすぐにそれを選んでいませんでした。(それは ''中型スタイル(1952年1月12日) '')ですが、明らかにIntlDateFormatter :: MEDIUMはちょうど私が必要としたものでした(先行ゼロ、 ) – userfuser

関連する問題