39

CSV ファイルからデータをインポートするスクリプトを作成しています。これを行っているときに、変数をチェックして、有効な日付文字列であるかどうかを確認できるようにしたいと考えています。

文字列が日付かどうかを確認する方法をいくつか見てきましたが、ほとんどの場合、形式を変更する必要があります。日付の形式がわかりません。

現在、私は strtotime() を使用していますが、これは簡単に失敗します

$field ="May";
if(strtotime($field)){
    echo "This is a date";
}

この場合、「May」は名前であり、日付ではありません。

より信頼性の高い機能を推奨できる人はいますか?

一部の方からの質問に基づいて編集します。

私の場合、変数が「日付」として渡されるには、日/月/年に固有である必要があるため、「5月」だけではカウントが曖昧になります。

それと以下の Paul の良い点に基づいて、文字列に次のような数字が含まれているかどうかをテストすることもできます。

$field ="May";
if(strtotime($field) && 1 === preg_match('~[0-9]~', $field)){
    echo "This is a date";
}else{
    echo "Nope not a date";
}

これは私の当面のニーズをカバーしているようですが、問題を見つけたり、改善を提案したりできますか?

4

3 に答える 3

57

date_parseを使用して、返された配列の値を確認します

$date = date_parse("May")

// ["year"] == FALSE
// ["month"] == 5
// ["day"] == FALSE

それらをcheckdateに渡すこともできます。

$date = date_parse($someString);
if ($date["error_count"] == 0 && checkdate($date["month"], $date["day"], $date["year"]))
    echo "Valid date";
else
    echo "Invalid date";
于 2012-05-21T20:42:06.030 に答える
5

この問題に対するオールインワンの答えはないと思います。ユースケースに応じて、異なる戦略を持つことができます。

あなたstrtotime()は完璧な解決策ですが、あなたが言うように、誤検知になる可能性があります。なんで?言葉や名前かもしれないからです。しかし、の結果はstrtotime('May')何ですか?

echo date(DateTime::ISO8601, strtotime('May'));
2012-05-21T00:00:00+0200

したがって、月のみを指定すると、現在の年の日付と、指定された月の午前 0 時から始まる現在の日付が返されます。考えられる解決策は、文字列に現在の日および/または現在の年が含まれているかどうかを確認することです。このようにして、日付が完全修飾された日付であり、有効であることを確認できます。

echo date(DateTime::ISO8601, strtotime('May Day')); // (strtotime() returns false)
1970-01-01T01:00:00+0100

echo date(DateTime::ISO8601, strtotime('May 21'));
2012-05-21T00:00:00+0200

単純なstrpos()、または正規表現でさえうまくいくはずです。

ただし、これは少し奇妙で、他に方法がない場合にのみ使用する必要があります。

より良い解決策は、一連の有効な形式を定義し、結果を補間して日付が有効であることを確認することだと思います。

$validDateFormatPatterns = array(
 '[0-9]{1,2}-[0-9]{1,2}-[0-9]{4}', // 21-05-2012, obviously this pattern is simple and would accept 05-21-2012,
 'the [0-9]{1,2}(th|st|nd|rd) (January|February|...|May|...|December) [0,9]{4}', // The 21st May 2012
);

ほとんどの場合をカバーするようにしてください。最新の日付形式をチェックする正規表現を見つけることができると確信しています。

いずれにせよ、関数を防弾にする簡単な方法がないため、関数を時々調整する必要があるかもしれません。

于 2012-05-21T20:39:09.323 に答える
0

これはずっと前に尋ねられたことは知っていますが、これを探して正規表現を避けようとした結果、次のようになりました。

function checkInputIsDate($date) {
    return (bool)strpbrk($date,1234567890) && strtotime($date);
}

strtotimeこれは、文字列に数字がstrpbrk含まれていることを確認strtotimeし、日付を出力することを確認することで、月のみが渡される上記の問題を取り除くためです。

そして、存在を知らなかった関数について学びました。

これが誰かに役立つことを願っています。

于 2016-01-10T05:00:25.753 に答える