【问题标题】:Dealing with well-formed but invalid dates in PHP DateTime在 PHP DateTime 中处理格式正确但无效的日期
【发布时间】:2015-08-19 16:14:59
【问题描述】:
我正在尝试使用 PHP 的 DateTime 来验证日期,但 DateTime 会接受一些格式正确但无效的日期,例如 2015-02-30,它将变成 March 2, 2015,而不会引发异常。使用 DateTime 或其他方法处理此问题有什么建议吗?
编辑:谢谢大家的帮助!我是通过捕获异常来处理错误的,但是我没有意识到异常只是在错误而不是警告时引发的,而且这种输入只会引发警告。
【问题讨论】:
标签:
php
validation
date
datetime
【解决方案1】:
使用DateTime::getLastErrors() 检查错误。格式正确但无效的日期:
$date = '2015-02-30';
DateTime::createFromFormat('Y-m-d', $date);
$errors = DateTime::getLastErrors();
print_r($errors);
产量:
Array
(
[warning_count] => 1
[warnings] => Array
(
[10] => The parsed date was invalid
)
[error_count] => 0
[errors] => Array
(
)
)
而格式不完整的日期$date = '02-30'; 产生:
Array
(
[warning_count] => 0
[warnings] => Array
(
)
[error_count] => 1
[errors] => Array
(
[5] => Data missing
)
)
【解决方案2】:
您可以在使用DateTime()之前先使用checkdate()检查日期是否有效:
$parts = explode('-', '2015-02-30');
if (checkdate($parts[1], $parts[2], $parts[0])) {
// DateTime() stuff here
}
Demo