Проверка формата даты в php

Я пытаюсь проверить дату с помощью PHP.

Я бы хотел, чтобы следующие форматы были действительными:

d/m/yy d/m/yyyy dd/m/yy dd/m/yyyy d/mm/yy d/mm/yyyy dd/mm/yy dd/mm/yyyy 

Я пробовал много регулярных выражений и различные варианты функции checkdate (). В настоящее время у меня есть что-то вроде этого:

 function _date_is_valid($str) { if(strlen($str) == 0) return TRUE; if(substr_count($str,'/') == 2) { if (preg_match("/^((((31\/(0?[13578]|1[02]))|((29|30)\/(0?[1,3-9]|1[0-2])))\/(1[6-9]|[2-9]\d)?\d{2})|(29\/0?2\/(((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))|(0?[1-9]|1\d|2[0-8])\/((0?[1-9])|(1[0-2]))\/((1[6-9]|[2-9]\d)?\d{2}))/", $str)) { $datearray = explode('/',$str); if($datearray[2] > 2030) return FALSE; return checkdate($datearray[1], $datearray[0], $datearray[2]); } else { return FALSE; } } return FALSE; } 

Это, однако, подтверждает даты, такие как 11/11/200 и 11/11/200 #

Как я могу подтвердить дату для соответствия требуемому формату?

Изменить: я могу проверить, что datearray [2] будет находиться между 10 и 30 и 2010 и 2030 годами. Но есть ли способ проверить его с помощью регулярного выражения?

Edit1: return TRUE on strlen ($ str) == 0 – это потому, что я хочу, чтобы пользователи могли добавлять события, не зная, когда произойдет событие, чтобы кто-то другой мог квалифицировать расписание и назначить событие на определенную дату позже


Только для записи. Я закончил:

 function _date_is_valid($str) { if(strlen($str) == 0) //To accept entries without a date return TRUE; if(substr_count($str,'/') == 2) { list($d,$m,$y) = explode('/',$str); if(($y >= 10 && $y <= 30) || ($y >= 2010 && $y <= 2030)) { return checkdate($m,$d,$y); } } return FALSE; } 

Спасибо за все ваши ответы

 function _date_is_valid($str) { if (substr_count($str, '/') == 2) { list($d, $m, $y) = explode('/', $str); return checkdate($m, $d, sprintf('%04u', $y)); } return false; } 

Если это всегда будет дата / месяц / год, вы можете использовать checkdate :

 function _date_is_valid($str) { $array = explode('/', $str); $day = $array[0]; $month = $array[1]; $year = $array[2]; $isDateValid = checkdate($month, $day, $year); return $isDateValid; } 

простой способ сделать это

 <?php if(!$formated_date = date_create_from_format('Ym-d',$dateVar)) 

Попробуй это:

 function _date_is_valid($str) { if (strlen($str) == 0) { return TRUE; } return preg_match('/^(\d{1,2})\/(\d{1,2})\/((?:\d{2}){1,2})$/', $str, $match) && checkdate($match[2], $match[1], $match[3]) && $match[2] <= 2030; } 

Я просто изменил ответ martin выше, который будет проверять любой тип даты и возвращения в формате, который вам нравится.

Просто измените формат, отредактировав ниже строку сценария strftime («10-10-2012», strtotime ($ dt));

 <?php echo is_date("13/04/10"); function is_date( $str ) { $flag = strpos($str, '/'); if(intval($flag)<=0){ $stamp = strtotime( $str ); }else { list($d, $m, $y) = explode('/', $str); $stamp = strtotime("$d-$m-$y"); } //var_dump($stamp) ; if (!is_numeric($stamp)) { //echo "ho" ; return "not a date" ; } $month = date( 'n', $stamp ); // use n to get date in correct format $day = date( 'd', $stamp ); $year = date( 'Y', $stamp ); if (checkdate($month, $day, $year)) { $dt = "$year-$month-$day" ; return strftime("%d-%b-%Y", strtotime($dt)); //return TRUE; }else { return "not a date" ; } } ?> 

То, что я сделал, чтобы проверить это было просто

  function dateValidate($pDate) { if(empty($pDate)) return true; $chDate = date('Ym-d', strtotime($pDate)); if($chDate != '1970-01-01') return true; else return false; } 

Вы можете найти это с помощью regexp too

как насчет if(strtotime($str) !== FALSE) $valid = TRUE;