使用DateTime :: createFromFormat验证Year

时间:2013-05-01 16:24:39

标签: php datetime

我有这个代码块,用于在使用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

2 个答案:

答案 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。但是,这也不会接受四位数的年份。

您的选择是:

  1. 在遇到日期验证码之前验证用户输入了正确的字符串长度。
  2. 使用字符串长度来确定使用的格式
  3. 使用正则表达式检查年份的长度并相应地更改格式
  4. 如果你打破了正则表达式,你也可以使用checkdate()
  5. 停止接受非常奇怪的非标准 DD / MM / YYYY格式的日期。在通常使用斜杠的情况下,预期的格式实际上是MM / DD / YYYY,这可能会造成严重的用户混淆。