2

目標:ローカル日付を対応する ISO 日付に変換する

私のアプローチ: http://codepad.viper-7.com/XEmnst

strftime("%Y-%m-%d",strtotime($date))";

利点:多くのフォーマットを非常にうまく変換します

欠点/問題:明らかに日付ではない文字列と数値を変換します。例えば

strftime("%Y-%m-%d",strtotime("A")) => 2012-10-29
strftime("%Y-%m-%d",strtotime("1")) => 1970-01-01

質問:

  1. 日付を識別して ISO 日付に変換するより良い方法はありますか?
  2. PHPでそれができるライブラリ/正規表現を知っていますか?
4

2 に答える 2

4

PHP のstrtotime()関数は、任意の文字列を取得し、それがどのような日付形式であるかを判断するために、すでに最善を尽くしています。

私はいくつかの理由でこの関数を嫌いますが、未知の日付形式の文字列を入力として与えられた場合、合理的な処理を行います。

ただし、strtotime()任意の日付形式はあいまいであるため、 の最善の努力でさえ十分ではありません。

05-06-072007 年 6 月 5 日なのか 2007 年 5 月 6 日なのかを判断する方法はありません。あるいは 2005 年 6 月 7 日でさえあります (はい、そのように日付を書く人もいます)。

単純明快な真実: それは不可能です。

意味のある方法で日付を信頼できるものにしたい場合は、任意の入力形式を受け入れることができるという考えを放棄する必要があります。

[編集] コメントで、入力はさまざまな Excel および CSV ファイルから来ていると言っています。

唯一の希望は、これらの各ファイル自体が一貫している場合です。特定のソースからのファイルが特定の入力形式を持つことがわかっている場合は、インポートするファイルの種類ごとにカスタム ラッパーを作成し、その形式用に処理できます。これは私が過去に使用したソリューションであり、処理しているファイルの形式を予測できる限り機能します。

ただし、個々のファイルに予測できない日付やあいまいな日付が含まれている場合は、運が悪く、不可能なタスクを抱えています。不良データを回避する唯一の方法は、ファイルのサプライヤーにキックバックして、データを修正するよう依頼することです。

于 2012-10-29T16:35:13.353 に答える
0

2012 年 5 月 6 日などの日付に直面すると、6 月 5 日または 5 月 6 日を扱っているかどうかが不明であり、DD MM YYYY が標準であるヨーロッパ諸国からの入力を取得する可能性がある場合に、問題が実際に発生すると思います。

1 つの入力フィールドだけを分析している場合は、区切り文字を検出して文字列を分割し、実際の日付のように見えるものを探す可能性があります。

この場合、PHP 関数のcheckdateが、最後の二重チェックとして役立ちます。

また、Mysql (これがデータの方向である場合) は、DATE フィールドに何を入れるか、区切り記号、先頭のゼロがないことなどについても非常に寛大であることに注意してください。ただし、それでも、YMD の順序を正しくする必要があります。チャンスがありますように。

究極の答えは、日付の自由テキスト入力を禁止することだと思いますが、ピッカーを提供します-しかし、もちろん、あなたは入ってくる日付に影響を与える立場にないかもしれません...

于 2012-10-29T15:26:47.380 に答える