2017-08-31 13 views
4
function validateDate($date, $format = 'm-Y') { 
    $d = DateTime::createFromFormat($format, $date); 
    return $d && $d->format($format) == $date; 
} 


validateDate('09-2017', 'm-Y'); 

機能は、私はそれが前の数ヶ月のためにtrueを返す一方で、これはfalseを返す理由に非常に困惑してるこのanswerまたはphp.netPHPのDateTime CreateFromFormat問題

からコピーされました。何か案は?

答えて

5

これは、曜日が指定されていないためです。そのため、現在の日付がデフォルトで使用されています。現在の日は31日ですが、9月には30日しかないので、10月1日にスキップします。この例では

ルック:

function validateDate($date, $format = 'm-Y') { 
    $d = DateTime::createFromFormat($format, $date); 
    echo $d->format("d-".$format); // added the day for debugging 
    return $d && $d->format($format) == $date; 
} 
var_dump(validateDate('08-2017', 'm-Y')); // 31-08-2017, true 
var_dump(validateDate('09-2017', 'm-Y')); // 01-10-2017, there's no 31-09-2017, false 

機能はこれが少し初歩的であるこのanswerまたはphp.net

からコピーされましたが、形式にはdをがない場合は、検出することができますし、これを避けるために手動で1に設定してください。

<?php 
function validateDate($date, $format = 'm-Y') { 
    if (strpos($format, "d") === false) { 
     $format = "d ".$format; 
     $date = "01 ".$date; 
    } 
    $d = DateTime::createFromFormat($format, $date); 
    return $d && $d->format($format) === $date; 
} 
var_dump(validateDate('08-2017', 'm-Y')); // 31-08-2017, true 
var_dump(validateDate('09-2017', 'm-Y')); // 01-09-2017, true 
+0

からコピーされました!ナイスキャッチ!優れた説明。どうもありがとうございました! :-) – theflarenet

+0

これは問題ありません!私はまったく気に入らなかった可能性のあるソリューションを追加しましたが、それをチェックしてください! – ishegg

+0

美しい!私はフォーマット内の "d"のクイックルックアップが大好きです。それを行う最も効率的な方法のようです。 – theflarenet

1

1日を提供していない場合。現在のものが使用されます。以前の答えで説明したのとまったく同じです。 しかし、これはすぐに一つのフォーマット記号で解決することができます:!、Unixのエポックにすべてのフィールド(年、月、日、時、分、秒、分数やタイムゾーン情報)をリセットします。 format tableを参照してください。

修正:

function validateDate($date, $format = 'm-Y') { 
    $d = DateTime::createFromFormat('!'.$format, $date); 
    return $d && $d->format($format) == $date; 
} 

機能はAHHHHHこのanswerまたはphp.net

+0

私の関数はどのようにコピーされましたか?典型的な日付チェックを行うのは2行のコードであり、複雑な行ではありません。私は間違いなく笑いました。しかし、素晴らしい答えが、 '!'について知りませんでした、+1ありがとう。 – ishegg