2013-05-01 2 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-значный год. Любая идея, где я ошибаюсь?

EDIT

1 - Исправьте дату тестирования как на комментарий OneTrickPony в

2 - я добавил var_dump из $ date_errors переменной. Поскольку формат «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

+0

@ Gordon thx для [3v4l.org] (http://www.3v4l.org), выглядит круто! –

+1

Обратите внимание, что ноябрь имеет только 30 дней;) –

ответ

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 ищет четыре цифры год. Это разборе «80» в 80-х годах нашей эры вместо 1980

Чтобы принять две цифры года, вам нужно будет использовать строчнуюy вместо заглавной буквы Y. Однако это также не будет принимать четырехзначный год.

варианта:

  1. Validate, что пользователь ввел правильную длину строки до встречи кода подтверждения даты.
  2. длина Используйте строку для определения формата используется
  3. Используйте регулярные выражения, чтобы проверить длину года и изменить формат соответственно
  4. Если вы вспыхиваете регулярные выражения, вы можете также просто использовать checkdate()
  5. Прекратить принимать даты в очень странно, нестандартно Формат DD/MM/YYYY. Если обычно используются косые черты, ожидаемый формат на самом деле представляет собой MM/DD/YYYY, что может создать существенную путаницу у пользователей.
Смежные вопросы