Подтвердить что ты не робот

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

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

 2012-06-14 01:46:28

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

/**
 * 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

Ответ 4

Я использую эту функцию в качестве параметра функции 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;
}

Ответ 5

Небольшая версия, это может помочь:

if(strtotime($date_string)){
    // it in date format
}

Ответ 6

Хотя у этого есть принятый ответ, он не будет эффективно работать во всех случаях. Например, я проверяю проверку даты в поле формы, которое я использую с датой "10/38/2013", и я получил верный объект DateObject, но дата была тем, что PHP называет "переполненным", так что "10/38/2013" станет "11/07/2013". Имеет смысл, но должны ли мы согласиться с датой реформирования или заставить пользователей ввести правильную дату? Для тех из нас, кто является валидацией формы нацистов, мы можем использовать это грязное исправление: fooobar.com/questions/186701/... и просто вернуть false, когда объект выдает это предупреждение.

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

Ответ 7

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

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

Ответ 9

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

?>

Ответ 10

 function validateDate($date, $format = 'Y-m-d H:i:s') 
 {    
     $d = DateTime::createFromFormat($format, $date);    
     return $d && $d->format($format) == $date; 
 } 
Функция

была скопирована из этого или php.net

Ответ 11

Если у вас есть PHP 5.2 Ответ Joey не будет работать. Вам необходимо расширить класс PHP DateTime:

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);

Ответ 12

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

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;
        }
    }
}

Ответ 13

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