web-dev-qa-db-ja.com

異なる言語でstrtotime?

Strtotimeはサーバーのデフォルト言語でのみ動作しますか?以下のコードは2005年8月11日に解決されるはずですが、英語の「aug」の代わりにフランス語の「aout」を使用しています。

これを処理する方法についてのアイデアはありますか?

<?php
    $date = strtotime('11 aout 05');
    echo date('d M Y',$date);
?>
25
Cory Dee

docs から

英語のテキストによる日時の説明をUnixタイムスタンプに解析します。

編集:6年後の現在、そしてstrtotime()が当面の問題に対して不適切な解決策であった理由についての付記となるはずだったものは受け入れられた答えになった????

マークBの答えを反映したい実際の質問によりよく答えるために:反対投票にもかかわらず、カスタムの月間インタープリターと組み合わせて date_create_from_format が最も信頼できるソリューションを提供します

しかし、PHP)に組み込まれている国際的な日付解析用の銀の弾丸はまだないようです。

8
Mr Griever

フランスの月の日付は次のとおりです。

ジャンヴィエフェヴリエマルスアヴリルマイジュインジュイエアオエセプテンブルオクトブルノベンブルデセンブル

したがって、月がフランス語である非常に特殊なケースでは、次を使用できます。

function myStrtotime($date_string) { return strtotime(strtr(strtolower($date_string), array('janvier'=>'jan','février'=>'feb','mars'=>'march','avril'=>'apr','mai'=>'may','juin'=>'jun','juillet'=>'jul','août'=>'aug','septembre'=>'sep','octobre'=>'oct','novembre'=>'nov','décembre'=>'dec'))); }

英語の$ date_stringを渡しても、関数はとにかく壊れません、これは置換を行わないためです。

11
Marco Demaio

前述のように、strtotimeはロケールを考慮しません。ただし、ドキュメントによれば、strptimeを使用できます( http://ca1.php.net/manual/en/function.strptime.php を参照)。

Month and weekday names and other language dependent strings respect the current locale set with setlocale() (LC_TIME).

システム、ロケール、エンコーディングによっては、アクセント付き文字を考慮する必要があることに注意してください。

10
Technoh

この方法は、strftimeを使用することで機能します。

setlocale (LC_TIME, "fr_FR.utf8"); //Setting the locale to French with UTF-8

echo strftime(" %d %h %Y",strtotime($date));

strftime

8
Rashad

この問題を部分的に解決する簡単な関数を書きました。完全なstrtotme()としては機能しませんが、日付の月名の数を決定します。

<?php
// For example, I get the name of the month from a 
// date "1 January 2015" and set him (with different languages):

echo month_to_number('January').PHP_EOL;           // returns "01" (January)
echo month_to_number('Января', 'ru_RU').PHP_EOL;   // returns "01" (January)
echo month_to_number('Мая', 'ru_RU').PHP_EOL;      // returns "05" (May)
echo month_to_number('Gennaio', 'it_IT').PHP_EOL;  // returns "01" (January)
echo month_to_number('janvier', 'fr_FR').PHP_EOL;  // returns "01" (January)
echo month_to_number('Août', 'fr_FR').PHP_EOL;     // returns "08" (August)
echo month_to_number('Décembre', 'fr_FR').PHP_EOL; // returns "12" (December)

同様に、数や曜日などの決定に進むことができます。

関数:

<?php

function month_to_number($month, $locale_set = 'ru_RU')
{
    $month  = mb_convert_case($month, MB_CASE_LOWER, 'UTF-8');
    $month  = preg_replace('/я$/', 'й', $month); // fix for 'ru_RU'
    $locale =
        setlocale(LC_TIME, '0');
        setlocale(LC_TIME, $locale_set.'.UTF-8');

    $month_number = FALSE;

    for ($i = 1; $i <= 12; $i++)
    {
        $time_month     = mktime(0, 0, 0, $i, 1, 1970);
        $short_month    = date('M', $time_month);
        $short_month_lc = strftime('%b', $time_month);

        if (stripos($month, $short_month) === 0 OR
            stripos($month, $short_month_lc) === 0)
        {
            $month_number = sprintf("%02d", $i);

            break;
        }
    }

    setlocale(LC_TIME, $locale); // return locale back

    return $month_number;
}
4
DmitryS

この質問を解決する鍵は、外国のテキスト表現を英語の対応表現に変換することです。私もこれが必要だったので、すでに与えられた回答に触発されて、英語の月の名前を取得するために機能する、Nice and clean関数を作成しました。

function getEnglishMonthName($foreignMonthName,$setlocale='nl_NL'){

  setlocale(LC_ALL, 'en_US');

  $month_numbers = range(1,12);

  foreach($month_numbers as $month)
    $english_months[] = strftime('%B',mktime(0,0,0,$month,1,2011));

  setlocale(LC_ALL, $setlocale);

  foreach($month_numbers as $month)
    $foreign_months[] = strftime('%B',mktime(0,0,0,$month,1,2011));

  return str_replace($foreign_months, $english_months, $foreignMonthName);

}

echo getEnglishMonthName('juli');
// Outputs July

曜日やその他のロケールでこれを調整できます。

3
Ogier Schelvis

これを Marco Demaio answer の拡張バージョンとして追加します。フランスの曜日と月の省略形を追加しました:

<?php
public function frenchStrtotime($date_string) {
  $date_string = str_replace('.', '', $date_string); // to remove dots in short names of months, such as in 'janv.', 'févr.', 'avr.', ...
  return strtotime(
    strtr(
      strtolower($date_string), [
        'janvier'=>'jan',
        'février'=>'feb',
        'mars'=>'march',
        'avril'=>'apr',
        'mai'=>'may',
        'juin'=>'jun',
        'juillet'=>'jul',
        'août'=>'aug',
        'septembre'=>'sep',
        'octobre'=>'oct',
        'novembre'=>'nov',
        'décembre'=>'dec',
        'janv'=>'jan',
        'févr'=>'feb',
        'avr'=>'apr',
        'juil'=>'jul',
        'sept'=>'sep',
        'déc'=>'dec',
        'lundi' => 'monday',
        'mardi' => 'tuesday',
        'mercredi' => 'wednesday',
        'jeudi' => 'thursday',
        'vendredi' => 'friday',
        'samedi' => 'saturday',
        'dimanche' => 'sunday',
      ]
    )
  );
}
0
Dmytro Sukhovoy