如何在PHP中确保有效的日期


How to ensure a valid date in PHP?

我一直在使用date_parse方法进行输入验证,这似乎很好…除了它实际上并没有验证日期的正确性。

例如:

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

来源:http://php.net/manual/en/function.checkdate.php

要清楚,2010-9-31是一个有效的日期,因此您得到的返回是正确的行为。

如果要强制使用特定的格式,可以使用date_parse_from_format

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

或者,如果这还不够,在解析$date之前对它使用preg_match。如果您决定使用preg_match,您可能需要问第二个问题。

如果你的意思是我认为你的意思,那么你应该看看checkdate

var_dump(checkdate(12, 31, 2000)); // true
var_dump(checkdate(2, 29, 2001)); // false, because was not a leap year
$d = date_parse("2010-9-31");
if(count($d["warnings"]) > 0) { 
  echo array_shift($d["warnings"]) . "'n"; 
}
// --> "The parsed date was invalid"