我有这个代码块,用于在使用DateTime::createFromFormat()提交到数据库插入之前验证格式正确的日期。我期待日期格式将'DD / MM / YYYY'转换为'YYYY-MM-DD',否则会引发错误。
$dateofbirth = trim($_POST['dateofbirth']);
$date = DateTime::createFromFormat('d/m/Y', $dateofbirth);
$date_errors = DateTime::getLastErrors();
var_dump($date_errors);
if ($date_errors['warning_count'] + $date_errors['error_count'] > 0) {
$dobError = 'Date '.$dateofbirth.' is not a valid DD/MM/YYYY format.';
$hasError = true;
} else {
$mysql_dob = $date->format('Y-m-d');
}
error_log($dateofbirth.' -> '.$mysql_dob);
此日期有效
$dateofbirth = '30/11/1980'; => 1980-11-30
但是这一次无声地失败
$dateofbirth = '30/11/80'; => 0080-11-30
因为我希望收到丢失的世纪数字的通知。我已经阅读了格式规则,并使用大写的'Y',这应该确保4位数年份。我知道哪里出错了?
修改
1 - 根据OneTrickPony的评论
更正测试日期2 - 我添加了$ date_errors变量的var_dump。由于格式为'd / m / Y'且输入为'30 / 11/80',我预计会出现错误或警告,但我没有收到错误或警告。
array(4) {
["warning_count"]=>
int(0)
["warnings"]=>
array(0) {
}
["error_count"]=>
int(0)
["errors"]=>
array(0) {
}
}
30/11/80 -> 0080-11-30
答案 0 :(得分:0)
来自DateTime::createFromFormat
http://www.php.net/manual/en/datetime.createfromformat.php
Returns a new DateTime instance or FALSE on failure.
因此,您应检查getLastErrors
$date === false
将错误检查更改为:
if ($date === false) {
$dobError = 'Date '.$dateofbirth.' is not a valid DD/MM/YYYY format.';
$hasError = true;
} else {
$mysql_dob = $date->format('Y-m-d');
}
答案 1 :(得分:-1)
$date = DateTime::createFromFormat('d/m/Y', $dateofbirth);
[...]
此日期有效
$dateofbirth = '30/11/1980'; => 1980-11-30
但是这一次无声地失败
$dateofbirth = '30/11/80'; => 0080-11-30
根据DateTime::createFromFormat()
手册页,您提供的格式非常明确地查找四位数年。它正在解析“80”作为公元80年而不是1980年。
要接受两位数年份,您需要使用小写 y
而不是大写Y
。但是,这也不会接受四位数的年份。
您的选择是:
checkdate()