2011-07-26 6 views
2

私は入力検証にdate_parseメソッドを使用していますが、実際には日付の正当性を検証しているわけではありません。PHPで有効な日付を保証する方法は?

date_parse("2010/9/31/"); // returns FALSE 
date_parse("2010-9-31"); // should return FALSE! 

は、どのように私はそれが2010年9月31日には、実際には、無効な日付であることを検証するために取得することができます。たとえば

+1

両方の日付が有効です。 – genesis

+1

実際には、septemberには31日しかないため、いずれの日付も有効ではありません。 –

+0

@genesis:カレンダーを見てください。有効ではありません。 – KingCrunch

答えて

3
<?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; 
} 
?> 

ソース:http://php.net/manual/en/function.checkdate.php

+0

この関数は不正確な結果を返します。例えば ​​'$ str = '2012-02-31';'のときは 'TRUE'を返します。問題は 'strtotime()'にあります。 'checkdate()'が有効と見なす '02/03/2012'に日付を変換しようとします。 –

0

私があなたが意味すると思うことを意味するならば、あなたはcheckdateを見てください。

var_dump(checkdate(12, 31, 2000)); // true 
var_dump(checkdate(2, 29, 2001)); // false, because was not a leap year 
1

明確にするため、2010-9-31は有効な日付であるので、あなたが取得しているリターンは正しい動作です。

あなたが特定の形式を強制しようとしている場合は、date_parse_from_format

print_r(date_parse_from_format("Y.n.j", $date)); 

それとも、それが十分でない場合は、それを解析する前に$日にpreg_matchを使用を使用することもできます。 preg_matchを使用することに決めた場合は、もう1つ質問することをお勧めします。

0
$d = date_parse("2010-9-31"); 
if(count($d["warnings"]) > 0) { 
    echo array_shift($d["warnings"]) . "\n"; 
} 

// --> "The parsed date was invalid" 
関連する問題