Я пытаюсь написать функцию, чтобы определить, является ли строка датой / временем с использованием PHP. В принципе, действительная дата / время будет выглядеть так:
2012-06-14 01:46:28
Очевидно, что хотя ее полностью динамическая любая из значений может измениться, но она всегда должна быть в форме XXXX-XX-XX XX:XX:XX
, как я могу написать регулярное выражение для проверки этого шаблона и вернуть true, если оно согласовано.
Если это ваша целая строка, просто попробуйте разобрать ее:
if (DateTime::createFromFormat('Ymd G:i:s', $myString) !== FALSE) { // it's a date }
Вот другой подход без использования регулярного выражения:
function check_your_datetime($x) { return (date('Ymd H:i:s', strtotime($x)) == $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
Я использую эту функцию как параметр функции PHP filter_var
.
yyyy-mm-dd hh:mm:ss
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/a/10120725/486863 и просто вернуть false, когда объект выдает это предупреждение.
Другим обходным решением будет сопоставление даты строки с отформатированной и сравнение двух для равного значения. Это кажется таким же грязным. Ну что ж. Такова природа PHP dev.
Я бы не использовал Regex для этого, а просто разделил строку и установил, что дата действительна:
list($year, $month, $day, $hour, $minute, $second) = preg_split('%( |-|:)%', $mydatestring); if(!checkdate($month, $day, $year)) { /* print error */ } /* check $hour, $minute and $second etc */
strtotime
? Списки? Обычные выражения?
Что не так с родным объектом DateTime PHP?
Если ваше сердце настроено на использование regEx, то txt2re.com всегда является хорошим ресурсом:
<?php $txt='2012-06-14 01:46:28'; $re1='((?:2|1)\\d{3}(?:-|\\/)(?:(?:0[1-9])|(?:1[0-2]))(?:-|\\/)(?:(?:0[1-9])|(?:[1-2][0-9])|(?:3[0-1]))(?:T|\\s)(?:(?:[0-1][0-9])|(?:2[0-3])):(?:[0-5][0-9]):(?:[0-5][0-9]))'; # Time Stamp 1 if ($c=preg_match_all ("/".$re1."/is", $txt, $matches)) { $timestamp1=$matches[1][0]; print "($timestamp1) \n"; } ?>
Если у вас есть PHP 5.2 Ответ Joey не будет работать. Вам необходимо расширить класс DateTime PHP:
class ExDateTime extends DateTime{ public static function createFromFormat($frmt,$time,$timezone=null){ $v = explode('.', phpversion()); if(!$timezone) $timezone = new DateTimeZone(date_default_timezone_get()); if(((int)$v[0]>=5&&(int)$v[1]>=2&&(int)$v[2]>17)){ return parent::createFromFormat($frmt,$time,$timezone); } return new DateTime(date($frmt, strtotime($time)), $timezone); } }
и вы можете использовать этот класс без проблем:
ExDateTime::createFromFormat('dmY G:i',$timevar);
function validateDate($date, $format = 'Ymd H:i:s') { $d = DateTime::createFromFormat($format, $date); return $d && $d->format($format) == $date; }
функция была скопирована из этого ответа или php.net
В меньшей версии это может помочь:
if(strtotime($date_string)){ // it's in date format }