2011-01-11 16 views
5

私は、テキスト文字列とdate()に与えられた書式指定子を取り、時、分、刻みを含む配列に解析しようとするいくつかのコード(wordpressプラグインの一部です)秒、日、月、年。PHPでローカライズされた日付文字列を解析する

現在、私は、これは実際にはかなりうまく機能

// $format contains the string originally given to date(), and $content is the rendered string 
if (function_exists('date_parse_from_format')) { 
    $content_parsed = date_parse_from_format($format, $content); 
} else { 
    $content = preg_replace("([0-9]st|nd|rd|th)","\\1",$content); 
    $content_parsed = strptime($content, dateFormatToStrftime($format)); 
    $content_parsed['hour']=$content_parsed['tm_hour']; 
    $content_parsed['minute']=$content_parsed['tm_min']; 
    $content_parsed['day']=$content_parsed['tm_mday']; 
    $content_parsed['month']=$content_parsed['tm_mon'] + 1; 
    $content_parsed['year']=$content_parsed['tm_year'] + 1900; 
} 

、そして私が投げてきたすべての組み合わせを扱うように思われる(つまりのstrtotimeが01/02/03のようなものと恐ろしく信頼できないことに注意)次のコードを使用しますそれで。

しかし、最近誰かが私に24 Ноябрь, 2010を与えました。これは2010年11月24日のロシア語です(日付形式はj F, Y)、それは年= 2010、月= null、日= 24として解析されます。

翻訳方法を知っている機能はありますか11月と11月の両方にНоябрь?

EDIT:print_r(setlocale(LC_ALL, 0));戻りCを実行

strptime()に戻って切り替えると、問題を解決するようだが、ドキュメントが警告:

内部的には、この関数は、システムのCライブラリで提供のstrptime()関数を呼び出します。この機能は、異なるオペレーティングシステム間で顕著に異なる動作を示す可能性があります。これらの問題に悩まされていないdate_parse_from_format()の使用は、PHP 5.3.0以降で推奨されています。

date_parse_from_format()正しいAPIですか、そうなら、どのようにして言語を認識させるのですか?

答えて

3

はロシアas hinted in the manualにロケールを設定してください:

月と曜日の名前、およびその他の言語依存の文字列はsetlocale()(LC_TIMEで設定された現在のロケールを尊重します)。

+0

問題は、他のユーザーが使用する可能性のあるプラグインだということです。「適切な」ソリューションを見つけることはうれしいでしょう。しかし、私はそれが動作していない場合を見つけるまで私は 'strptime()'に固執すると思います... – Mikeage

+0

@Mikeage UnitTestは適切です:) 'date_create_from_format'がローカライズされた文字列を解析できるかどうか試してみてください。私はそれがないと思うが、それにもかかわらず試してみてください。 – Gordon

+0

私は18 Mag 2013(= 2013-05-18)のように、イタリアの日付を解析するためにstrptime()とdate_create_from_formatの両方を試してみました。 – damko

1

ロケールパラメータを取り、日付解析を実行する前にlocale_set_default($ locale)を呼び出そうとするとよいでしょう。

$originalLocale = locale_get_default(); 
$locale ? $locale : $originalLocale; 
locale_set_default(locale); 

// date parsing code 

locale_set_default($originalLocale); 

私はこれをテストしていませんが、試してみてください。 私はロシア語のロケール文字列が "ru-Latn"だと信じています。

+0

私の問題は、ロケールが何になっているのか分かりません。 – Mikeage

0

質問は既に回答済みですが、提供された解決策はどれも私のために働いていません。

if(!preg_match('/^en_US/', $locale)){ 

    $months_short = array('jan' => t('jan'), 'feb' => t('feb'), 'mar' => t('mar'), 'apr' => t('apr'), 
      'may' => t('may'), 'jun' => t('giu'), 'jul' => t('lug'), 'aug' => t('ago'), 
      'sep' => t('set'), 'oct' => t('ott'), 'nov' => t('nov'), 'dec' => t('dec')); 

    foreach ($months_short as $month_short => $month_short_translated) { 
     $date = preg_replace('/'.$month_short_translated.'/', $month_short, strtolower($date)); 
    } 

} 

$pieces = date_parse_from_format($format,$date); 

if($pieces && $pieces['error_count'] == 0 && checkdate($pieces['month'], $pieces['day'], $pieces['year'])){ 

    return date('Y-m-d', mktime(0,0,0,$pieces['month'],$pieces['day'],$pieces['year'])); 

} 

トンは()月の翻訳された省略形を返します。

は、これが私の解決策です。

恐らく最良の解決策ではないでしょう(有効な翻訳がないと失敗するため)。私の場合はうまくいきます。

関連する問題