Проверка даты php

Я пытаюсь настроить проверку даты php (MM/DD/YYYY), но у меня возникают проблемы. Вот пример того, что я получил:

$date_regex = '%\A(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d\z%'; 

$test_date = '03/22/2010'; 
if (preg_match($date_regex, $test_date,$_POST['birthday']) ==true) {
    $errors[] = 'user name most have no spaces';`

Ответ 1

Вы можете использовать checkdate. Например, что-то вроде этого:

$test_date = '03/22/2010';
$test_arr  = explode('/', $test_date);
if (checkdate($test_arr[0], $test_arr[1], $test_arr[2])) {
    // valid date ...
}

Более параноидальный подход, который не слепо верит в ввод:

$test_date = '03/22/2010';
$test_arr  = explode('/', $test_date);
if (count($test_arr) == 3) {
    if (checkdate($test_arr[0], $test_arr[1], $test_arr[2])) {
        // valid date ...
    } else {
        // problem with dates ...
    }
} else {
    // problem with input ...
}

Ответ 2

Вы можете использовать некоторые методы класса DateTime, что может быть удобно; а именно DateTime::createFromFormat() в сочетании с DateTime::getLastErrors().

$test_date = '03/22/2010';

$date = DateTime::createFromFormat('m/d/Y', $test_date);
$date_errors = DateTime::getLastErrors();
if ($date_errors['warning_count'] + $date_errors['error_count'] > 0) {
    $errors[] = 'Some useful error message goes here.';
}

Это даже позволяет нам увидеть, что на самом деле вызвало предупреждения или ошибки синтаксического анализа даты (посмотрите на массивы warnings и errors в $date_errors).

Ответ 3

Хотя checkdate хорош, это кажется очень сжатой функцией для проверки, а также вы можете предоставить форматы. [Источник]

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

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


Дополнительный ->format() необходим для случаев, когда дата недействительна, но createFromFormat все еще удается создать объект DateTime. Например:

// Gives "2016-11-10 ..." because Thursday falls on Nov 10
DateTime::createFromFormat('D M j Y', 'Thu Nov 9 2016');

// false, Nov 9 is a Wednesday
validateDate('Thu Nov 9 2016', 'D M j Y');

Ответ 4

Вместо громоздкого DateTime объект.. просто используйте ядро ​​date()

function isValidDate($date, $format= 'Y-m-d'){
    return $date == date($format, strtotime($date));
}

Ответ 5

Решение Nicolas лучше. Если вы хотите в регулярном выражении,

попробуйте это,

это будет подтверждено, с 01/01/1900 по 12/31/2099 Соответствует неверным датам, таким как 31 февраля. Принимает тире, пробелы, косые черты и точки в качестве разделителей даты

(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)[0-9]{2}

Ответ 6

REGEX должен быть последним средством. PHP имеет несколько функций, которые будут проверяться для вас. В вашем случае, checkdate - лучший вариант. http://php.net/manual/en/function.checkdate.php

Ответ 7

Используйте его:

function validate_Date($mydate,$format = 'DD-MM-YYYY') {

    if ($format == 'YYYY-MM-DD') list($year, $month, $day) = explode('-', $mydate);
    if ($format == 'YYYY/MM/DD') list($year, $month, $day) = explode('/', $mydate);
    if ($format == 'YYYY.MM.DD') list($year, $month, $day) = explode('.', $mydate);

    if ($format == 'DD-MM-YYYY') list($day, $month, $year) = explode('-', $mydate);
    if ($format == 'DD/MM/YYYY') list($day, $month, $year) = explode('/', $mydate);
    if ($format == 'DD.MM.YYYY') list($day, $month, $year) = explode('.', $mydate);

    if ($format == 'MM-DD-YYYY') list($month, $day, $year) = explode('-', $mydate);
    if ($format == 'MM/DD/YYYY') list($month, $day, $year) = explode('/', $mydate);
    if ($format == 'MM.DD.YYYY') list($month, $day, $year) = explode('.', $mydate);       

    if (is_numeric($year) && is_numeric($month) && is_numeric($day))
        return checkdate($month,$day,$year);
    return false;           
}         

Ответ 8

Я знаю, что это более старая запись, но я разработал следующую функцию для проверки даты:

function IsDateTime($aDateTime) {
    try {
        $fTime = new DateTime($aDateTime);
        $fTime->format('m/d/Y H:i:s');
        return true;
    }
    catch (Exception $e) {
        return false;
    }
}

Ответ 9

Не уверен, ответит ли этот вопрос на вопрос или собирается помочь.

$dt = '6/26/1970' ; // or // '6.26.1970' ;

$dt = preg_replace("([.]+)", "/", $dt);

$test_arr  = explode('/', $dt);

if (checkdate($test_arr[0], $test_arr[1], $test_arr[2]) && preg_match("/[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}/", $dt))

     { echo(date('Y-m-d', strtotime("$dt")) . "<br>"); }

   else

     { echo "no good...format must be in mm/dd/yyyy"; }

Ответ 10

Мы можем использовать простой тип ввода "даты", как показано ниже:

Birth date: <input type="date" name="userBirthDate" /><br />

Затем мы можем связать интерфейс DateTime со встроенной функцией "explode":

public function validateDate()
    {
        $validateFlag = true;
        $convertBirthDate = DateTime::createFromFormat('Y-m-d', $this->birthDate);
        $birthDateErrors = DateTime::getLastErrors();

        if ($birthDateErrors['warning_count'] + $birthDateErrors['error_count'] > 0)
        {
            $_SESSION['wrongDateFormat'] = "The date format is wrong.";
        }

        else
        {
            $testBirthDate = explode('-', $this->birthDate);
            if ($testBirthDate[0] < 1900)
            {
                $validateFlag = false;
                $_SESSION['wrongDateYear'] = "We suspect that you did not born before XX century.";
            }
        }

        return $validateFlag;
    }

Я тестировал его в Google Chrome и IE, все работает правильно. Furthemore, Chrome отображает простой дополнительный интерфейс. Если вы ничего не пишете на входе или не записываете в плохом формате (правильно следующее: "1919-12-23" ), вы получите первое утверждение. Если вы пишете все в хорошем формате, но вы вводите неверную дату (я предполагал, что никто не может родиться до XX века), ваш контроллер отправит второе утверждение.

Ответ 11

Попробуйте это

/^(19[0-9]{2}|2[0-9]{3})\-(0[1-9]|1[0-2])\-(0[1-9]|1[0-9]|2[0-9]|3[0-1])((T|\s)(0[0-9]{1}|1[0-9]{1}|2[0-3]{1})\:(0[0-9]{1}|1[0-9]{1}|2[0-9]{1}|3[0-9]{1}|4[0-9]{1}|5[0-9]{1})\:(0[0-9]{1}|1[0-9]{1}|2[0-9]{1}|3[0-9]{1}|4[0-9]{1}|5[0-9]{1})((\+|\.)[\d+]{4,8})?)?$/

это регулярное выражение, справедливое для:

  • 2017-01-01T00: 00: 00 + 0000
  • 2017-01-01 00: 00: 00 + 00: 00
  • 2017-01-01T00: 00: 00 + 00: 00
  • 2017-01-01 00: 00: 00 + 0000
  • 2017-01-01

Помните, что это будет охватывать весь случай даты и даты с символом (-)