11

私はこれまでにこれに出くわしたことがないとは信じられません。

基本的に、人間が作成したテキスト ドキュメントのテキストを解析しています。解析する必要があるフィールドの 1 つは日付と時刻です。私はオーストラリアにいるので、日付は次のようにフォーマットされていますが、米国でフォーマットされた日付として解析したいだけですdd/mm/yyyystrtotimeまた、/前述したように、これらのドキュメントは手書きであり、一部のドキュメントはd M yy.

複数の組み合わせを試しましsetlocaleたが、何を試しても、言語は常に米国英語に設定されています。

ここで setlocale が重要であることは間違いありませんが、適切なコードを見つけることができないようです。これらを試しました:

  • au
  • アウエン
  • en_AU
  • オーストラリア
  • aus

他に試せることはありますか?

明確にするために:私はWindowsボックスを備えたIISで実行しています。

本当にありがとう :)

イアン

例:

$mydatetime = strtotime("9/02/10 2.00PM");
echo date('j F Y H:i', $mydatetime);

プロデュース

2 September 2010 14:00

私はそれを生成したい:

9 February 2010 14:00

私の解決策

私にとってははるかに読みやすい解決策であるため、ここで回答の1つにチェックマークを付けていますが、ここに私が思いついたものがあります:

$DateTime = "9/02/10 2.00PM";
$USDateTime = preg_replace('%([0-3]?[0-9]{1})\s*?[\./ ]\s*?((?:1[0-2])|0?[0-9])\s*?[./ ]\s*?(\d{4}|\d{2})%', '${2}/${1}/${3}', $DateTime);  
echo date('j F Y H:i',strtotime($USDateTime));

ユーザーが入力した日付と一貫性があるとは限りませんので、正規表現をもう少し複雑にしました。

  • 0 または 0 ~ 3 の 1 桁
  • 0 から 9 までの 1 桁 -- はい、これは有効な日付として 37 に一致しますが、正規表現はすでに十分に大きいと思います!
  • 空白の可能性があります
  • 区切り文字 (「.」、「/」、または「 」)
  • 空白の可能性があります
  • また:
    • 10 から 12 の間の数値または
    • オプションで先頭に 0 を付けた 1 から 9 までの数値
  • 空白の可能性があります
  • 区切り文字 (「.」、「/」、または「 」)
  • 空白の可能性があります
  • また:
    • 2 桁の数字 OR
    • 4 桁の数字

うまくいけば、これは日付の書き方のほとんどのスタイルと一致します...

4

6 に答える 6

20

strtotimePHPに英国の日付形式の使用を強制するように思われる簡単な修正があります。つまり、着信文字列のすべての「/」を「-」に置き換えます。

例:

date('Y-m-d', strtotime('01/04/2011'));

生成されます:2011-01-04

date('Y-m-d', strtotime('01-04-2011'));

生成されます:2011-04-01

これを達成するために使用できますstr_replace

例:

str_replace('/', '-', '01/04/2011');

編集:

コメントで述べられているように、これは、PHPがスラッシュをアメリカ人として解釈し、ドット/ダッシュをヨーロッパ人として解釈するために機能します。

私はこのトリックを広範囲に使用しましたが、これまでのところ問題はありませんでした。

誰かがこれを使用しない正当な理由がある場合は、コメントしてください。

于 2011-04-11T10:13:20.803 に答える
3

問題は、フォーマット引数strtotimeをとらないことです。どうですか?strptime

于 2010-03-15T03:05:14.967 に答える
1

setlocale()は、まさにあなたが説明する理由のためにひどいです:あなたはあなたが何を得ようとしているのか決してわかりません。文字列を手動で処理するのが最適です。

Zend FrameworkのZend_Dateは、より正確で一貫性のある日付処理を約束する1つの代替手段です。まだ自分で使った経験はなく、使い始めたばかりですが、今のところ気に入っています。

于 2010-03-15T03:02:05.463 に答える
1

ああ、私たち幸運なオーストラリア人が抱える古い問題。

私が過去にやったことは、このようなものです

public static function getTime($str) { // 3/12/2008

       preg_match_all('/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/', $str, $matches);

       return (isset($matches[0][0])) ? strtotime($matches[3][0] . '-' . $matches[2][0] . '-' . $matches[1][0]) : NULL;

    }

これはこの形式の日付に依存していますがdd/mm/yyyy

おそらく別の正規表現などを使用して、変更された正規表現から変換d M yyまたは使用できます。これが正しいかどうかはわかりませんが、それは始まりかもしれません:

/^(\d{1,2})(?:\/|\s)(\d{1,2})(?:\/|\s)(\d{2,4})$/

于 2010-03-15T03:20:54.913 に答える
0
$date = date_create_from_format('d/m/Y', $date_string);
$unix_timestamp = $date->getTimestamp();

また

$date = DateTime::createFromFormat('d/m/Y', $date_string);
$unix_timestamp = $date->getTimestamp();
于 2015-07-24T13:34:44.830 に答える