web-dev-qa-db-fra.com

validation de date php

Je suis en train d'essayer de configurer une validation de date php (MM/JJ/AAAA) mais j'ai des problèmes Voici un échantillon de ce que j'ai eu:

$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';`
42
Pablo Lopez

Vous pouvez utiliser checkdate . Par exemple, quelque chose comme ceci:

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

Une approche plus paranoïaque, qui ne croit pas aveuglément l’entrée:

$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 ...
}
69
Nicolás

Vous pouvez utiliser certaines méthodes de la classe DateTime , qui pourraient être pratiques; à savoir, DateTime::createFromFormat() en conjonction avec 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.';
}

Cela nous permet même de voir la cause réelle des avertissements/erreurs d'analyse de la date (regardez les tableaux warnings et errors dans $date_errors).

49
salathe

Bien que checkdate soit bon, cela semble être une fonction très concise à valider et vous pouvez également donner des formats. [ La source ]

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

function a été copié à partir de cette réponse ou php.net


La ->format() supplémentaire est nécessaire dans les cas où la date est invalide mais que createFromFormat parvient toujours à créer un objet DateTime. Par exemple:

// 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');
25
Joel

Au lieu du volume DateTime object .., utilisez simplement le noyau date ()

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

La solution de Nicolas est la meilleure. Si vous voulez en regex,

essaye ça,

correspond aux dates invalides telles que le 31 février Accepte les tirets, les espaces, les barres obliques et les points comme séparateurs de date

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

REGEX devrait être un dernier recours. PHP a quelques fonctions qui valideront pour vous. Dans votre cas, le checkdate est la meilleure option. http://php.net/manual/en/function.checkdate.php

3
Jared Drake

Utilise le:

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

Je sais que ceci est un ancien billet, mais j'ai développé la fonction suivante pour valider une date

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

Je ne sais pas si cela répond à la question ou si cela va aider ...

$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"; }
0
Dennis

Nous pouvons utiliser un type d'entrée simple "date", comme ci-dessous:

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

Ensuite, nous pouvons relier l’interface DateTime à la fonction intégrée «exploser»:

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

Je l'ai testé sur Google Chrome et IE, tout fonctionne correctement. De plus, Chrome affiche une interface supplémentaire simple. Si vous n'écrivez rien en entrée ou si vous ne l'écrivez pas au mauvais format (le message correct suit: '1919-12-23'), vous obtiendrez la première déclaration. Si vous écrivez tout dans un bon format, mais que vous tapez une mauvaise date (j'ai supposé que personne ne pourrait naître avant le XX siècle), votre contrôleur enverra le deuxième relevé.

0
Plusce

Essaye ça

/^(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})?)?$/

cette expression régulière valide pour:

  • 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

N'oubliez pas que cela couvrira tous les cas de date et heure avec caractère ( - )

0
David Nguyen