Функция, чтобы проверить, является ли строка датой
Я пытаюсь написать функцию, чтобы определить, является ли строка датой/временем с использованием PHP. В принципе, действительная дата/время будет выглядеть так:
Очевидно, что хотя его полностью динамическое любое из значений может меняться, но оно всегда должно быть в форме XXXX-XX-XX XX:XX:XX , как я могу написать регулярное выражение для проверки этого шаблона и вернуть true, если оно соответствует.
12 ответов
Если это вся ваша строка, то просто попробуйте ее проанализировать:
if (DateTime::createFromFormat('Y-m-d H:i:s', $myString) !== FALSE) < // it a date >
Это не решение. У меня есть DateTime::createFromFormat(‘m/d/Y’, ’10/38/2013′) и это создает действительный объект DateTime, а не ложь. Дата преобразуется в object(DateTime)#39 (3) < ["date"]=>string(19) «2013-11-07 23:45:55» [«timezone_type»]=> int(3) [«timezone»]=> string(3) «UTC» >
Хлоп. Мне нравится, что эти вещи никогда не упоминаются в документации . Вы случайно не нашли альтернативу? (Редактировать: Дата форматирует документы, которые вы можете переполнять / недогружать месяцами и днями, но не дает подсказки, что делать, если вы не хотите такого поведения.
Хорошо, нет никакого решения или установки, чтобы переопределить это в PHP. Я заметил обходной путь в ответах stackoverflow.com/a/19666600/486863
Это решение действительно не работает нормально для дат, подобных той, которая указана в cj5. Который может быть очень расстраивающим. Я также использовал это решение stackoverflow.com/questions/10120643/…
Здесь используется другой подход без использования регулярного выражения:
function check_your_datetime($x)
Если вы не знаете формат даты:
/** * Check if the value is a valid date * * @param mixed $value * * @return boolean */ function isDate($value) < if (!$value) < return false; >try < new \DateTime($value); return true; >catch (\Exception $e) < return false; >> var_dump(isDate('2017-01-06')); // true var_dump(isDate('2017-13-06')); // false var_dump(isDate('2017-02-06T04:20:33')); // true var_dump(isDate('2017/02/06')); // true var_dump(isDate('3.6. 2017')); // true var_dump(isDate(null)); // false var_dump(isDate(true)); // false var_dump(isDate(false)); // false var_dump(isDate('')); // false var_dump(isDate(45)); // false
var_dump (IsDate ( ‘теперь’)); // true var_dump (isDate (‘завтра’)); // true var_dump (isDate (‘вчера’)); //правда
var_dump (isDate («R»)) = true. вероятно, не то, что задумано. Я думаю, что это соответствует часовому поясу или что-то.
Я использую эту функцию как параметр для функции PHP filter_var .
- Он проверяет даты в формате yyyy-mm-dd hh:mm:ss
- Он отклоняет даты, соответствующие шаблону, но все еще недействительные (например, 31 апреля).
function filter_mydate($s) < if (preg_match('@^(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)$@', $s, $m) == false) < return false; >if (checkdate($m[2], $m[3], $m[1]) == false || $m[4] >= 24 || $m[5] >= 60 || $m[6] >= 60) < return false; >return $s; >
Хотя у этого есть принятый ответ, он не будет эффективно работать во всех случаях. Например, я проверяю проверку даты в поле формы, которое я использую с датой «10/38/2013», и я получил верный объект DateObject, но дата была тем, что PHP называет «переполненным», так что «10/38/2013» станет «11/07/2013». Имеет смысл, но должны ли мы согласиться с датой реформирования или заставить пользователей ввести правильную дату? Для тех из нас, кто является валидацией формы нацистов, мы можем использовать это грязное исправление: https://stackoverflow.com/questions/10120643/php-datetime-createfromformat-functionality и просто вернуть false, когда объект выдает это предупреждение.
Другим обходным решением будет сопоставление даты строки с форматированным и сравнение двух для равного значения. Это кажется таким же грязным. Ну что ж. Такова природа PHP dev.
Небольшая версия, это может помочь:
Есть ли функция PHP для проверки нулевой даты
но NULL можно использовать, если столбец даты пуст, если в базе данных хранится «0000-00-00 00:00:00», он не пустой и, следовательно, не NULL.
Я только что предположил, что «нулевая дата» используется в случае, когда дата не установлена состояние. Вот почему я предложил использовать NULL . @Col. Осколок: просто добавьте дополнительное условие для нулей: WHERE date_pub IS [NOT] NULL AND date_pub < NOW() .
@Crozin Мне не нужны никакие дополнительные условия. NULL равен нулю, а нулевое значение равно нулю. НЕ СМЕШАТЬ ИХ
11 ответов
Я думаю, что вам не нужна стенография.
Это своего рода микро-оптимизация.
Вы уже потратили больше времени на задание этого вопроса, чем сможете сэкономить на таком сокращении в год среднего кодирования. Просто напишите и перейдите.
У вас нет более важных проблем?
Кроме того, с такой стенографией вы будете запутывать свой собственный код.
Ваше текущее выражение совершенно ясно, читает «if date is empty»
но все предложенные фрагменты не так понятны. Придя к этому коду спустя несколько месяцев, вы будете озадачены вопросом, если такой монстр кода имеет какое-то особое значение.
То, что вы действительно хотели, — это удобочитаемость. Но у вас это уже есть. Хотя все предлагаемые сокращения не имеют.
Эй, Колнел. Давно не слышал. Я помню, что вы отчитали меня на пару постов некоторое время назад. Приятно видеть, что вы все еще там с таким большим количеством времени, чтобы делать удары по тем из нас, кто хочет исследовать и учиться. Ваши комментарии всегда ожидаются . продолжайте стрелять 🙂
полностью согласен с полковником Шрапнелью. Зачем усердствовать на себя и терять время, пока оно уже работает
@Dr седловине неровная, но он прав — пример вы показываете на сегодняшний день является самым читаемым из сгустка.
MySQL Date with not null
In this page, we have discussed how to test if a date value is not NULL.
Sample table: newpublisher
SELECT pub_name,pub_city,country,estd FROM newpublisher WHERE estd IS NOT NULL;
Relational Algebra Expression:
Relational Algebra Tree:
Explanation
The above MySQL statement will filter the rows whose estd date is NOT NULL.
Sample Output:
mysql> SELECT pub_name,pub_city,country,estd -> FROM newpublisher -> WHERE estd IS NOT NULL; +--------------------------+-----------+---------+------------+ | pub_name | pub_city | country | estd | +--------------------------+-----------+---------+------------+ | Jex Max Publication | New York | USA | 1969-12-25 | | BPP Publication | Mumbai | India | 1985-10-01 | | Ultra Press Inc. | London | UK | 1948-07-10 | | Summer Night Publication | New York | USA | 1990-12-10 | | Novel Publisher Ltd. | New Delhi | India | 2000-01-01 | +--------------------------+-----------+---------+------------+ 5 rows in set (0.00 sec)
Publisher's name Date of establishment Current date AGE query('SELECT pub_name,pub_city,country,estd FROM newpublisher WHERE estd IS NOT NULL') as $row) < echo ""; echo "" . $row['pub_name'] . " "; echo "" . $row['pub_city'] . " "; echo "" . $row['country'] . " "; echo "" . $row['estd'] . " "; echo " "; > ?>