YYYY-MM-DD
在一行语句中检查和验证日期
function isValidDate($date) {
return preg_match("/^(\d{4})-(\d{1,2})-(\d{1,2})$/", $date, $m)
? checkdate(intval($m[2]), intval($m[3]), intval($m[1]))
: false;
}
请在此处查看我的答案中的详细信息。
不要盲目使用DateTime::createFromFormat
来验证日期。让我们取一个不存在的日期2018-02-30
,看看:
$d = DateTime::createFromFormat("Y-m-d", "2018-02-30");
var_dump((bool) $d); // bool(true)
是的,它返回true
,不像false
您预期的那样。更有意思的:
$d = DateTime::createFromFormat("Y-m-d", "2018-99-99");
var_dump((bool) $d); // bool(true)
另外true
......所以,它只验证位数。再试一次:
$d = DateTime::createFromFormat("Y-m-d", "ABCD-99-99");
var_dump($d); // bool(false)
终于false
。
我们可以从这个片段中看到这里发生了什么:
$d = DateTime::createFromFormat("Y-m-d", "2018-02-30");
var_dump($d);
// var_dump OUTPUT
object(DateTime)#1 (3) {
["date"]=>
string(26) "2018-03-02 16:41:34.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(3) "UTC"
}
如您所见,当我们传递 non-existent2018-02-30
时,DateTime
对象包含2018-03-02
. 我假设这是因为 2018 年 2 月有 28 天,即最大日期是2018-02-28
,当我们过了一天时30
, createFromFormat 只是在 30 天后2018-02-01
创建新日期,而没有任何先前的日期验证。