Ниже приведено то, как я ранее проверял даты. У меня также были свои собственные функции для преобразования форматов даты, однако теперь я использую PHP-класс DateTime, чтобы они больше не нуждались в них. Как лучше всего проверить действительную дату с помощью DataTime? Пожалуйста, дайте мне знать, считаете ли вы, что я должен использовать DataTime в первую очередь. благодаря
PS. Я использую Object oriented style, а не процедурный стиль.
static public function verifyDate($date) { //Given m/d/Y and returns date if valid, else NULL. $d=explode('/',$date); return ((isset($d[0])&&isset($d[1])&&isset($d[2]))?(checkdate($d[0],$d[1],$d[2])?$date:NULL):NULL); }
Вы можете попробовать это:
static public function verifyDate($date) { return (DateTime::createFromFormat('m/d/Y', $date) !== false); }
Это выводит true / false. Вы можете напрямую вернуть объект DateTime
:
static public function verifyDate($date) { return DateTime::createFromFormat('m/d/Y', $date); }
Затем вы возвращаете объект DateTime
или false при ошибке.
ОБНОВИТЬ:
Спасибо Elvis Ciotti, который показал, что createFromFormat принимает недопустимые даты, такие как 45/45/2014. Дополнительная информация: https://stackoverflow.com/a/10120725/1948627
Я расширил метод с помощью строгой проверки:
static public function verifyDate($date, $strict = true) { $dateTime = DateTime::createFromFormat('m/d/Y', $date); if ($strict) { $errors = DateTime::getLastErrors(); if (!empty($errors['warning_count'])) { return false; } } return $dateTime !== false; }
Вы можете проверить этот ресурс: http://php.net/manual/en/datetime.getlasterrors.php
В кодах PHP указано:
try { $date = new DateTime('asdfasdf'); } catch (Exception $e) { print_r(DateTime::getLastErrors()); // or echo $e->getMessage(); }
Попробуй это:
function is_valid_date($date,$format='dmY') { $f = DateTime::createFromFormat($format, $date); $valid = DateTime::getLastErrors(); return ($valid['warning_count']==0 and $valid['error_count']==0); }
С помощью DateTime вы можете сделать кратчайший валидатор даты и времени для всех форматов.
function validateDate($date, $format = 'Ymd H:i:s') { $d = DateTime::createFromFormat($format, $date); return $d && $d->format($format) == $date; } var_dump(validateDate('2012-02-28 12:12:12')); # true var_dump(validateDate('2012-02-30 12:12:12')); # false
функция была скопирована из этого ответа или php.net