it-roy-ru.com

Функция, чтобы проверить, является ли строка датой

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

 2012-06-14 01:46:28

Очевидно, что любое из значений может быть полностью динамическим, но оно всегда должно быть в форме XXXX-XX-XX XX:XX:XX, как я могу написать регулярное выражение, чтобы проверить этот шаблон и вернуть true в случае совпадения.

42
Justin

Если это вся ваша строка, просто попробуйте ее проанализировать:

if (DateTime::createFromFormat('Y-m-d H:i:s', $myString) !== FALSE) {
  // it's a date
}
76
Joey

Вот другой подход без использования регулярных выражений:

function check_your_datetime($x) {
    return (date('Y-m-d H:i:s', strtotime($x)) == $x);
}
31
Bjoern

Если вы не знаете формат даты:

/**
 * 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
15
John Linhart

Я использую эту функцию как параметр для функции 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)[email protected]', $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;
}
4
Salman A

Уменьшенная версия может помочь:

if(strtotime($date_string)){
    // it's in date format
}
3
Yogesh Mistry

Хотя на это есть принятый ответ, он не будет эффективно работать во всех случаях. Например, я проверяю валидацию даты в поле формы, которое я использую, используя дату «10/38/2013», и я получила верный DateObject, но дата была тем, что PHP называет «переполненным», так что 38.10.2013 "становится" 11.07.2013 ". Имеет смысл, но должны ли мы просто принять реформированную дату или заставить пользователей вводить правильную дату? Для тех из нас, кто является нацистами проверки формы, мы можем использовать это грязное исправление: https://stackoverflow.com/a/10120725/486863 и просто вернуть false, когда объект выдает это предупреждение.

Другой обходной путь - сопоставить строковую дату с форматированной датой и сравнить их на одинаковое значение. Это выглядит так же грязно. Ну что ж. Такова природа PHP dev.

3
cj5

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

list($year, $month, $day, $hour, $minute, $second) = preg_split('%( |-|:)%', $mydatestring);
if(!checkdate($month, $day, $year)) {
     /* print error */
} 
/* check $hour, $minute and $second etc */
0
Artefact2

strtotime? Списки? Регулярные выражения?

Что не так с PHP родным объектом DateTime?

http://www.php.net/manual/en/datetime.construct.php

0
Sherlock

В моем проекте это, кажется, работает:

function isDate($value) {
    if (!$value) {
        return false;
    } else {
        $date = date_parse($value);
        if($date['error_count'] == 0 && $date['warning_count'] == 0){
            return checkdate($date['month'], $date['day'], $date['year']);
        } else {
            return false;
        }
    }
}
0
Gabor

Если ваше сердце настроено на использование 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";
  }

?>
0
PT114
 function validateDate($date, $format = 'Y-m-d H:i:s') 
 {    
     $d = DateTime::createFromFormat($format, $date);    
     return $d && $d->format($format) == $date; 
 } 

функция была скопирована из этого ответа или php.net

0
José Rodrigues

Если у вас PHP 5.2, ответ Джоуи не сработает. Вам нужно расширить класс 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('d.m.Y G:i',$timevar);
0
MERT DOĞAN

if (strtotime ($ date)> strtotime (0)) {echo 'это дата'}

0
emmanuel