245 votes

Déterminer correctement si la chaîne de date est une date valide dans ce format

Je reçois une chaîne de date d'une API, et elle est formatée comme suit yyyy-mm-dd .

J'utilise actuellement une expression rationnelle pour valider le format de la chaîne, ce qui fonctionne bien, mais je vois certains cas où le format pourrait être correct selon la chaîne, mais où la date serait en fait invalide. 2013-13-01 par exemple.

Existe-t-il un meilleur moyen en PHP de prendre une chaîne de caractères telle que 2013-13-01 et dire s'il s'agit d'une date valide ou non pour le format yyyy-mm-dd ?

5voto

Prince Ahmed Points 376

Valider avec date de vérification fonction :

$date = '2019-02-30';

$date_parts = explode( '-', $date );

if(checkdate( $date_parts[1], $date_parts[2], $date_parts[0] )){
    //date is valid
}else{
    //date is invalid
}

4voto

Julian Points 548

Que pensez-vous de celui-ci ?

Nous utilisons simplement un bloc try-catch.

$dateTime = 'an invalid datetime';

try {
    $dateTimeObject = new DateTime($dateTime);
} catch (Exception $exc) {
    echo 'Do something with an invalid DateTime';
}

Cette approche n'est pas limitée à un seul format de date et d'heure, et il n'est pas nécessaire de définir une fonction.

1voto

Akumaburn Points 107

Solution Regex testée :

    function isValidDate($date)
    {
            if (preg_match("/^(((((1[26]|2[048])00)|[12]\d([2468][048]|[13579][26]|0[48]))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|[12]\d))))|((([12]\d([02468][1235679]|[13579][01345789]))|((1[1345789]|2[1235679])00))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|1\d|2[0-8])))))$/", $date)) {
                    return $date;
            }
            return null;
    }

Cette fonction renverra null si la date n'est pas valide ou n'est pas au format aaaa-mm-jj, sinon elle renverra la date.

1voto

Marco Demaio Points 8667
/*********************************************************************************
Returns TRUE if the input parameter is a valid date string in "YYYY-MM-DD" format (aka "MySQL date format")
The date separator can be only the '-' character.
*********************************************************************************/
function isMysqlDate($yyyymmdd)
{
    return checkdate(substr($yyyymmdd, 5, 2), substr($yyyymmdd, 8), substr($yyyymmdd, 0, 4)) 
        && (substr($yyyymmdd, 4, 1) === '-') 
        && (substr($yyyymmdd, 7, 1) === '-');
}

1voto

Jake Stewart Points 77

Pour compléter la réponse acceptée, vous pouvez vérifier si la date ou l'heure de la date est valide en vérifiant si la date formatée est un instanceof DateTime .

$date = DateTime::createFromFormat('Ymd', $value);
$is_datetime = ($date instanceof DateTime);
$is_valid_datetime_format = $is_datetime
  ? ($date->format('Ymd') === $value)
  : false;

if (!$is_datetime || !$is_valid_datetime_format) {
  // Not a valid date.
  return false;
}

Cela permet d'attraper toutes les valeurs qui ne sont pas des DateTime comme des chaînes de caractères aléatoires ou une date invalide telle que 20202020 .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X