Проверьте, является ли переменная допустимой датой с PHP

Я работаю над скриптом, который будет импортировать некоторые данные из файла CSV. Поскольку я делаю это, я хочу проверить переменную, чтобы увидеть, является ли она допустимой строкой даты.

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

прямо сейчас я использую strtotime (), но это нелегко

$field ="May"; if(strtotime($field)){ echo "This is a date"; } 

В этом случае «май» – это имя человека, а не дата вообще.

Может ли кто-нибудь рекомендовать более надежную функцию?

Редактируйте на основе вопросов от некоторых из вас.

Для переменной, которая будет передаваться как «дата» в моем случае, она должна быть специфичной для дня / месяца / года, поэтому просто «май» будет смутно считать.

Основываясь на этом и ниже, мы также можем проверить, содержит ли строка число, например

 $field ="May"; if(strtotime($field) && 1 === preg_match('~[0-9]~', $field)){ echo "This is a date"; }else{ echo "Nope not a date"; } 

Кажется, это покрывает мои непосредственные потребности, но может ли кто-нибудь выявить какие-либо проблемы или предложить улучшения?

Используйте date_parse и проверьте значения возвращаемого массива

 $date = date_parse("May") // ["year"] == FALSE // ["month"] == 5 // ["day"] == FALSE 

Вы также можете передать их в checkdate .

 $date = date_parse($someString); if ($date["error_count"] == 0 && checkdate($date["month"], $date["day"], $date["year"])) echo "Valid date"; else echo "Invalid date"; 

Я не думаю, что есть все-в-один ответ на эту проблему. У вас может быть другая стратегия в зависимости от вашего варианта использования.

Ваш strtotime() – идеальное решение, но, как вы говорите, вы можете оказаться в ложном позитиве. Зачем? Потому что может быть слово или имя. Однако, каков результат strtotime('May') ?

 echo date(DateTime::ISO8601, strtotime('May')); 2012-05-21T00:00:00+0200 

Таким образом, только месяц возвращает дату текущего года и текущего дня, начиная с полуночи с данным месяцем. Возможным решением было бы проверить, имеет ли ваша строка текущий день и / или текущий год, таким образом, вы можете проверить, чтобы ваша дата была полностью квалифицированной и действительной.

 echo date(DateTime::ISO8601, strtotime('May Day')); // (strtotime() returns false) 1970-01-01T01:00:00+0100 echo date(DateTime::ISO8601, strtotime('May 21')); 2012-05-21T00:00:00+0200 

Простое strpos() или даже регулярное выражение должно делать трюк.

Однако это немного странно и должно использоваться только в том случае, если у вас нет другого способа сделать это.

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

 $validDateFormatPatterns = array( '[0-9]{1,2}-[0-9]{1,2}-[0-9]{4}', // 21-05-2012, obviously this pattern is simple and would accept 05-21-2012, 'the [0-9]{1,2}(th|st|nd|rd) (January|February|...|May|...|December) [0,9]{4}', // The 21st May 2012 ); 

Вы должны попытаться охватить большую часть дела, и я уверен, что вы сможете найти регулярное выражение, которое проверяет самый текущий формат даты.

В любом случае вам может понадобиться время от времени адаптировать вашу функцию, потому что нет простого способа сделать ее пуленепробиваемой.

Я знаю, что это было задано давно, но, оглядываясь вокруг и пытаясь избежать регулярного выражения, я придумал следующее:

 function checkInputIsDate($date) { return (bool)strpbrk($date,1234567890) && strtotime($date); } 

Это работает, потому что это strtotime проблемы, описанные выше, где только один месяц передается в strtotime , убедившись, что в строке есть строка с strpbrk а также проверка strtotime выводит дату.

И узнал о какой-то функции, которой я не знал.

Надеюсь, это поможет кому-то.