2013-05-01 38 views
2

我有这块代码用于在使用DateTime::createFromFormat()提交到数据库插入之前验证正确格式化的日期。我期待日期格式将“DD/MM/YYYY”转换为“YYYY-MM-DD”,否则会引发错误。使用DateTime验证年份:: createFromFormat

$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 
+3

它不会默默失败:http://3v4l.org/bap8p – Gordon 2013-05-01 16:30:00

+0

@Gordon thx for [3v4l.org](http://www.3v4l.org),看起来很酷! – 2013-05-01 16:32:41

+1

请注意,11月只有30天;) – 2013-05-01 16:33:12

回答

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
$date = DateTime::createFromFormat('d/m/Y', $dateofbirth); 

[...]

此日期作品

$dateofbirth = '30/11/1980'; => 1980-11-30 

但是这一次失败默默

$dateofbirth = '30/11/80'; => 0080-11-30 

按照DateTime::createFromFormat()帮助页面,你提供的格式非常明确ly寻找四位数字 year。它的解析“80”为80年公元1980年,而不是

要接受一个两位数的一年,你就需要使用小写y,而不是一个大写Y的。然而,这也不会接受四位数的年份。

的选项有:

  1. 验证用户遇到日期验证码之前输入了正确的字符串长度。
  2. 使用字符串长度来确定的格式使用
  3. 使用正则表达式来检查一年的长度,并改变格式相应
  4. 如果你打破了正则表达式,你可能也只是使用checkdate()
  5. 停止接受日期非常奇怪,非标准 DD/MM/YYYY格式。在通常使用斜线的情况下,预期的格式实际上是MM/DD/YYYY,这可能会导致用户很大的困惑。