2013-07-10 2 views
1

Таким образом, пользователь может ввести дату рождения, набрав его или используя средство выбора даты. Это может привести к ошибкам, поэтому на стороне сервера я бы хотел проверить, действительно ли это действительная дата.PHP check user input date

Я много читал о strtotime() и видел много примеров, но не 100% правильный.

Это то, что у меня есть:

$geboortedatum = $_POST['geboortedatum']; 
$geboortedatum = date("Y-m-d", strtotime($geboortedatum)); 
list($y, $m, $d) = explode("-", $geboortedatum); 

// var_dump(checkdate($d,$m,$y)); 
if(checkdate($d, $m, $y)) { 
    echo "OK Date"; 
} 
else { 
    echo "BAD Date"; 
    exit(); 
} 

Это работает большую часть времени. Есть ли какой-либо надежный метод для проверки, является ли ввод реальной и правильной датой?

// EDIT

Это не хороший пример! Он также не работает, когда пользователь вводит 31-31-1980. Это также верно, хотя этого не должно быть!

+0

StrToTime это хорошо, но это не экстрасенс. НЕ ИСПОЛЬЗУЙТЕ его для проверки произвольных входных форматов. Это будет ** рано или поздно. –

+0

Хорошо, конечно, но как я могу проверить правильный ввод? Должно быть что-то, что я могу сделать, чтобы проверить, правильно ли это ... – Nick

+0

ну, что такое 01-02-03? 1 февраля 2003 года? 3 января 2002 года? применять формат даты, и если то, что вводит пользователь, не подтверждается, удалите сообщение об ошибке в их лице. –

ответ

6

Вы можете использовать комбинацию strtotime() и checkdate(), чтобы увидеть, если дата является действительным:

function isRealDate($date) { 
    if (false === strtotime($date)) { 
     return false; 
    } 
    list($year, $month, $day) = explode('-', $date); 
    return checkdate($month, $day, $year); 
} 

использование

if (isRealDate($geboortedatum)) { 
    // date is ok 
} 
else { 
    // date is not ok 
} 
+0

Невозможно заставить этот код работать. Как я могу назвать эту функцию? Что-то вроде этого: isRealDate ($ geboortedatum); Он никогда ничего не возвращает :( – Nick

+0

См. Мой обновленный ответ, так как теперь он содержит пример использования –

+0

. Это работает неплохо ... Хотя год вроде 1900, похоже, не работает. Но год вроде 2 делает, догадываюсь из-за ограничений strtotime. Поэтому я сделаю это принятым ответом. Спасибо! – Nick

1
function isValidDateTime($dateTime) 
{     
    if (preg_match("/^(\d{4})-(\d{2})-(\d{2}) ([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-])$/", $dateTime, $matches)) 
    {      
     if (checkdate($matches[2],$matches[3], $matches[1])) {             
      return true;         
     }     
    }     
    return false;  
}  

Попробуйте приведенный выше код.

+0

Не работает ... Попробуйте сами ввести 31/31/2010. Он по-прежнему говорит о допустимой дате, хотя это не так :( – Nick

+0

Проверьте обновленный код. Я не тестировал его, хотя –

+0

Я хочу попробовать, но как я могу назвать функцию? Что-то вроде: isValidDateTime ($ geboortedatum).? ??? – Nick

1

С помощью функции DateTime вы можете сделать кратчайшую дату & валидатор времени для всех форматов.

function validateDate($date, $format = 'Y-m-d 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 
var_dump(validateDate('2012-02-28', 'Y-m-d')); # true 
var_dump(validateDate('28/02/2012', 'd/m/Y')); # true 
var_dump(validateDate('30/02/2012', 'd/m/Y')); # false 
var_dump(validateDate('14:50', 'H:i')); # true 
var_dump(validateDate('14:77', 'H:i')); # false 
var_dump(validateDate(14, 'H')); # true 
var_dump(validateDate('14', 'H')); # true 

var_dump(validateDate('2012-02-28T12:12:12+02:00', 'Y-m-d\TH:i:sP')); # true 
# or 
var_dump(validateDate('2012-02-28T12:12:12+02:00', DateTime::ATOM)); # true 

var_dump(validateDate('Tue, 28 Feb 2012 12:12:12 +0200', 'D, d M Y H:i:s O')); # true 
# or 
var_dump(validateDate('Tue, 28 Feb 2012 12:12:12 +0200', DateTime::RSS)); # true 
var_dump(validateDate('Tue, 27 Feb 2012 12:12:12 +0200', DateTime::RSS)); # falsede here 

функция была скопирована из этого answer или php.net