私は入力検証にdate_parseメソッドを使用していますが、実際には日付の正当性を検証しているわけではありません。PHPで有効な日付を保証する方法は?
date_parse("2010/9/31/"); // returns FALSE
date_parse("2010-9-31"); // should return FALSE!
は、どのように私はそれが2010年9月31日には、実際には、無効な日付であることを検証するために取得することができます。たとえば
?
私は入力検証にdate_parseメソッドを使用していますが、実際には日付の正当性を検証しているわけではありません。PHPで有効な日付を保証する方法は?
date_parse("2010/9/31/"); // returns FALSE
date_parse("2010-9-31"); // should return FALSE!
は、どのように私はそれが2010年9月31日には、実際には、無効な日付であることを検証するために取得することができます。たとえば
?
<?php
function is_date($str)
{
$stamp = strtotime($str);
if (!is_numeric($stamp))
{
return FALSE;
}
$month = date('m', $stamp);
$day = date('d', $stamp);
$year = date('Y', $stamp);
if (checkdate($month, $day, $year))
{
return TRUE;
}
return FALSE;
}
?>
この関数は不正確な結果を返します。例えば '$ str = '2012-02-31';'のときは 'TRUE'を返します。問題は 'strtotime()'にあります。 'checkdate()'が有効と見なす '02/03/2012'に日付を変換しようとします。 –
私があなたが意味すると思うことを意味するならば、あなたはcheckdate
を見てください。
var_dump(checkdate(12, 31, 2000)); // true
var_dump(checkdate(2, 29, 2001)); // false, because was not a leap year
明確にするため、2010-9-31
は有効な日付であるので、あなたが取得しているリターンは正しい動作です。
あなたが特定の形式を強制しようとしている場合は、date_parse_from_format
print_r(date_parse_from_format("Y.n.j", $date));
それとも、それが十分でない場合は、それを解析する前に$日にpreg_match
を使用を使用することもできます。 preg_matchを使用することに決めた場合は、もう1つ質問することをお勧めします。
$d = date_parse("2010-9-31");
if(count($d["warnings"]) > 0) {
echo array_shift($d["warnings"]) . "\n";
}
// --> "The parsed date was invalid"
両方の日付が有効です。 – genesis
実際には、septemberには31日しかないため、いずれの日付も有効ではありません。 –
@genesis:カレンダーを見てください。有効ではありません。 – KingCrunch