Я получаю строку даты из API, и она отформатирована как yyyy-mm-dd
.
В настоящее время я использую регулярное выражение для проверки формата строки, который работает нормально, но я вижу некоторые случаи, когда это может быть правильный формат в соответствии со строкой, но на самом деле недопустимая дата. то есть 2013-13-01
, например.
Есть ли лучший способ в PHP, чтобы взять строку, такую как 2013-13-01
и сказать, является ли она действительной датой или нет для формата yyyy-mm-dd
?
Ответы:
Вы можете использовать
DateTime
класс для этой цели:[ Функция взята из этого ответа . Также на php.net . Первоначально написано Главич . ]
Тестовые случаи:
Демо!
источник
strtotime
для получения метки времени Unix, а затемdate('Y-m-d', $t)
для получения строковой даты. Затем вы сравниваете их так же, как этот ответ.strtotime
, но для нестандартных форматов, которыеstrtotime
не распознает, вам понадобится другое решение. А для php версии 5.2 поддержка прекращена в январе 2011 года, для 5.3 поддержка остановлена в августе 2014 года.var_dump( validateDate('2012-2-9'));
'Y-n-j'
начальных нулей, то формат должен быть @reignsly.$d
что не будет ложным, вы дадите ему дату, в которой есть переполненные части, например, 13-й месяц (2013-13-01). Но это действительно зависит от того, что вы хотите. Если вам нужно, например,validateDate('2015-55-66')
чтобы быть действительным, то да, вам нужно только проверить,$d
является ли объект или нет.Определите, является ли какая-либо строка датой
источник
yyyy-mm-dd
.2015-02-30
как действительная дата, потому что когда указанный день превышает количество дней в данном месяце (или отрицательное значение), php переносится на следующий месяц. Поскольку дата гарантированно имеет формат,yyyy-mm-dd
это можно исправить, изменив возврат наreturn (bool)strtotime($myDateString) && date("Y-m-d", strtotime($myDateString)) == $myDateString;
.(bool)strtotime('s')
, как правда?$myDateString = str_replace("/", '-', $myDateString);
перед возвратом, если строка даты содержит косые черты (/), такие как: - дд / мм / ггггПросто используйте с предустановленной функцией php:
Тест
источник
if
чтобы просто вернутьсяtrue
илиfalse
вернуть сам тест.return sizeof($tmpDate) == 3 && checkdate($tmpDate[1]...
2
,20
,202
,2020
или даже если год20201
- это возвращает истину каждый раз.Определите, является ли строка датой, даже если строка имеет нестандартный формат
(strtotime не принимает произвольный формат)
источник
if
можно просто вернутьtrue
илиfalse
вернуть сам тест.Эта опция не только проста, но также принимает практически любой формат, хотя в нестандартных форматах она может содержать ошибки.
источник
202
возвращает отрицательное число - который все еще проходит тест.Вы также можете проанализировать дату для даты месяца и года, а затем использовать функцию PHP, о
checkdate()
которой вы можете прочитать здесь: http://php.net/manual/en/function.checkdate.phpВы также можете попробовать это:
источник
Самый простой способ проверить, является ли данная дата действительной, вероятно, преобразовав ее в unixtime, используя ее
strtotime
, отформатировав в формат данной даты, а затем сравнив ее:function isValidDate($date) { return date('Y-m-d', strtotime($date)) === $date; }
Конечно, вы можете использовать регулярное выражение для проверки правильности, но оно будет ограничено данным форматом, каждый раз, когда вам придется редактировать его для соответствия другим форматам, а также это будет больше, чем требуется. Встроенные функции - это лучший способ (в большинстве случаев) для достижения работы.
источник
checkdate()
- но я считаю, что checkdate не работает, если год ЛЮБОЕ значение:2, 20, 202, 2020, 20201
- все возвращают true. Я собираюсь с вашим решением!Согласна с ответом cl-sah, но звучит лучше, короче ...
Тест
источник
count($tempDate) === 3
хотяУ меня есть такая вещь, что даже с PHP мне нравится находить функциональные решения. Так, например, ответ, данный @migli, действительно хороший, очень гибкий и элегантный.
Но есть проблема: что, если вам нужно проверить множество строк DateTime в одном и том же формате? Вам придется повторить формат повсеместно, что противоречит принципу СУХОЙ . Мы могли бы поместить формат в константу, но, тем не менее, нам пришлось бы передавать константу в качестве аргумента для каждого вызова функции.
Но не бойся больше! Мы можем использовать карри для нашего спасения! PHP не делает эту задачу приятной, но все еще возможно реализовать карри с помощью PHP:
Итак, что мы только что сделали? По сути, мы обернули тело функции в анонимный и вместо этого вернули такую функцию. Мы можем вызвать функцию проверки так:
Да, не большая разница ... но настоящая сила исходит от частично примененной функции , которая стала возможной благодаря карри:
Функциональное программирование FTW!
источник
Я боюсь, что большинство проголосовавших решение ( https://stackoverflow.com/a/19271434/3283279 ) не работает должным образом. Четвертый контрольный пример (var_dump (validateDate ('2012-2-25')); // false) неверен. Дата правильна, потому что она соответствует формату - m позволяет месяц с или без нуля (см .: http://php.net/manual/en/datetime.createfromformat.php ). Поэтому дата 2012-2-25 имеет формат Ymd, и контрольный пример должен быть истинным, а не ложным.
Я считаю, что лучшим решением будет проверить возможную ошибку следующим образом:
источник
Как насчет этого?
Мы просто используем блок try-catch.
Этот подход не ограничен только одним форматом даты / времени, и вам не нужно определять какую-либо функцию.
источник
'0000-00-00 00:00:00'
является допустимым значением даты и времени. Это просто первое значение. Однако свойство date объекта datetime будет'-0001-11-30 00:00:00'
.Проверенное решение Regex:
Это вернет ноль, если дата недействительна или не в формате гггг-мм-дд, в противном случае она вернет дату.
источник
Подтвердить с помощью функции checkdate :
источник
источник
источник
Попробуйте это:
источник