2013-05-01 69 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,這可能會導致用戶很大的困惑。