1

クラスを使用してアプリケーションの日付と時刻を国際化することを検討していIntlDateFormatterますが、マニュアルでは何をすべきかが明確ではありません。

アプリケーションに次の日付、時刻、および日時の形式があるとします。

2013-07-01 午後 10 時

7 月 1 日 @ 午後 10 時

7月1日

午後10時

そして、別のロケールでは次のように表示されるようにローカライズしたいと考えています。

2013 年 7 月 1 日 22 時

7 月 1 日 22 時

7月1日

22:00

どうすればこれを行うことができますか?これを処理するために8 つの異なるIntlDateFormatterオブジェクトを作成する必要があるでしょうか?

$fmt['en-CA']['dt_long'] = new IntlDateFormatter("en_CA", null, null, null, IntlDateFormatter::GREGORIAN, 'Y-M-dd h:mm a');
$fmt['fr-CA']['dt_long2'] = new IntlDateFormatter("fr_CA", null, null, null, IntlDateFormatter::GREGORIAN, 'Y-M-dd H:mm');

$fmt['en-CA']['dt_short'] = new IntlDateFormatter("en_CA", null, null, null, IntlDateFormatter::GREGORIAN, 'MMM d @ h:mm a');
$fmt['fr-CA']['dt_short2'] = new IntlDateFormatter("fr_CA", null, null, null, IntlDateFormatter::GREGORIAN, 'MMM d 'à' H'h'mm');

...

クラス定数の 2 番目と 3 番目のパラメーターが何らかの理由でそこにあるはずなので、私は何か間違っていると思いますよね?

例と説明は素晴らしいでしょう。

4

1 に答える 1

2

これら 4 つの特定の形式が必要な場合は、コードが正しい方法です。ICU ライブラリをラップする IntlDateFormatter は、いくつかの標準フォーマットを提供しており、それぞれの国/言語で同意した人もいると思います。

彼らの考え方の「基準」に問題がなければ、クラスを次のように呼び出しても構いません。

if (version_compare(PHP_VERSION, '5.3.0', '<')) {
    exit ('IntlDateFormatter is available on PHP 5.3.0 or later.');
}    
if (!class_exists('IntlDateFormatter')) {
    exit ('You need to install php_intl extension.');
}

$mediumShortFormatter = new IntlDateFormatter(
    'fr_CA',
    IntlDateFormatter::MEDIUM,
    IntlDateFormatter::SHORT
);
$longShortFormatter = new IntlDateFormatter(
    'fr_CA',
    IntlDateFormatter::LONG,
    IntlDateFormatter::SHORT
);
$longNoneFormatter = new IntlDateFormatter(
    'fr_CA',
    IntlDateFormatter::LONG,
    IntlDateFormatter::NONE
);
$noneShortFormatter = new IntlDateFormatter(
    'fr_CA',
    IntlDateFormatter::NONE,
    IntlDateFormatter::SHORT
);

$datetime = new DateTime("2013-07-01 22:00:00");
echo $mediumShortFormatter->format($datetime) . "\n";
echo $longShortFormatter->format($datetime) . "\n";
echo $longNoneFormatter->format($datetime) . "\n";
echo $noneShortFormatter->format($datetime) . "\n";

上記のコードは、これらを返します。

2013-07-01 22:00
1 juillet 2013 22:00
1 juillet 2013
22:00

これらはあなたの質問のものと同一ではありません。表示された元の形式が本当に必要な場合は、はい、それらを1つずつ指定する必要があります。

カナダ フランス語の場合、フォーマットがユーザーにとって正しいものであると確信しているかもしれません。しかし、他のロケールについては、それらのカスタム形式を設定しますか? 標準形式が (理想的ではありませんが) ユーザーに受け入れられる場合は、それらの既定の形式を使用することをお勧めします。そうすれば、他の言語/国での正しい形式について心配する必要はありません。

于 2013-10-29T08:39:32.097 に答える