Проверка формата даты в 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 годами. Но есть ли способ проверить это с помощью регулярного выражения?
Правка1: верните значение TRUE для 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;
}
Спасибо за все ваши ответы
7 answers
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('Y-m-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;
}
Я просто изменил приведенный выше ответ Мартина, который подтвердит любой тип даты и вернет ее в том формате, который вам нравится.
Просто измените формат, отредактировав строку ниже скрипта 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('Y-m-d', strtotime($pDate));
if($chDate != '1970-01-01')
return true;
else
return false;
}
Вы также можете узнать это с помощью регулярного выражения
Как насчет if(strtotime($str) !== FALSE) $valid = TRUE;