Я работаю над скриптом, который будет импортировать некоторые данные из файла 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
выводит дату.
И узнал о какой-то функции, которой я не знал.
Надеюсь, это поможет кому-то.