Strtotime日期验证传递无效日期


strtotime date validation passes on invalid date

我正在建立一个基本的CMS,允许客户端添加文章到他们的移动应用程序。CMS是用PHP编码的,将使用JSON将内容传递到移动应用程序。

现在我的问题是有一个选项可以在某个日期发布文章,所以我想验证日期以检查它是否有效。

所以为了测试可能性,我制作了一个小脚本。我使用strtotime()来检查日期是否有效,我的脚本是:

<?php
    $date[] = '2011-31-01';
    $date[] = '2011-02-31';
    foreach($date as $str) {
        if(strtotime($str) == false) {
            $result[] = '<p>[' . $str . '] Resulted in an <span style="color: red;">Error.</span></p>';
        } else {
            $result[] = '<p>[' . $str . '] Resulted in <span style="color: green;">Success.</span></p>';
        }
    }
    foreach($result as $return) {
        echo $return;
    }
?>

现在我的问题是日期2011-02-3131st February 2011返回有效,当显然它不是。我的问题是为什么会这样?是否有更好的方法来检查日期是否有效和存在?

checkdate();验证公历日期。如果给定的日期有效,则返回TRUE;否则返回FALSE。

 if(checkdate(2, 31, 2011)){
      echo "Yeah";
  } else {echo "nah";}

返回false!

除非你有一个(或一个小集合)固定的日期字符串格式,否则很难得到一个可接受的结果。如果您知道格式,您可以直接自己解析字符串(然后使用checkdate进行测试),或者使用strptime尝试对已知格式进行解析,直到获得有效结果。

如果您不知道格式,并且必须使用strtotime,那么您需要接受strtotime将尝试以最佳方式解析日期字符串。这可能会导致日期与预期的不同。