【问题标题】:How to ensure a valid date in PHP?如何确保 PHP 中的有效日期?
【发布时间】:2011-07-26 17:10:13
【问题描述】:

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

例如:

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

我怎样才能验证 2010-9-31 实际上是一个无效的日期?

【问题讨论】:

  • 实际上,这两个日期都无效,因为 9 月根本没有 31 天。
  • @genesis:看看日历:它们无效...

标签: php validation date


【解决方案1】:
<?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

【讨论】:

  • 这个函数会返回错误的结果。例如,当$str = '2012-02-31'; 时,它将返回TRUE。问题在于strtotime(),它会尝试将日期转换为02/03/2012checkdate() 认为这是有效的。
【解决方案2】:

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

如果您尝试强制使用特定格式,您可能需要使用date_parse_from_format

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:
      $d = date_parse("2010-9-31");
      if(count($d["warnings"]) > 0) { 
        echo array_shift($d["warnings"]) . "\n"; 
      }
      
      // --> "The parsed date was invalid"
      

      【讨论】:

        猜你喜欢
        • 2017-12-14
        • 1970-01-01
        • 2011-10-20
        • 2010-09-09
        • 1970-01-01
        • 2010-12-04
        • 2011-12-25
        • 1970-01-01
        • 2012-06-04
        相关资源
        最近更新 更多