web-dev-qa-db-fra.com

Vérifier la date de validité en utilisant la classe DateTime de PHP

Voici comment j'ai vérifié les dates précédemment. J'avais aussi mes propres fonctions pour convertir les formats de date, cependant, j'utilise maintenant la classe DateTime de PHP, donc je n'en ai plus besoin. Comment vérifier au mieux une date valide en utilisant DataTime? Faites-moi également savoir si vous pensez que je devrais utiliser DataTime en premier lieu. Merci

PS. J'utilise un style orienté objet et non un style procédural.

static public function verifyDate($date)
{
  //Given m/d/Y and returns date if valid, else NULL.
  $d=explode('/',$date);
  return ((isset($d[0])&&isset($d[1])&&isset($d[2]))?(checkdate($d[0],$d[1],$d[2])?$date:NULL):NULL);
}
15
user1032531

Vous pouvez essayer celui-ci:

static public function verifyDate($date)
{
    return (DateTime::createFromFormat('m/d/Y', $date) !== false);
}

Cette sortie vrai/faux. Vous pouvez retourner directement l'objet DateTime:

static public function verifyDate($date)
{
    return DateTime::createFromFormat('m/d/Y', $date);
}

Ensuite, vous récupérez un objet DateTime ou false en cas d'échec.

METTRE À JOUR:

Merci à Elvis Ciotti qui a montré que createFromFormat accepte les dates non valides telles que 45/45/2014 . Plus d'informations à ce sujet: https://stackoverflow.com/a/10120725/1948627

J'ai étendu la méthode avec une option de vérification stricte:

static public function verifyDate($date, $strict = true)
{
    $dateTime = DateTime::createFromFormat('m/d/Y', $date);
    if ($strict) {
        $errors = DateTime::getLastErrors();
        if (!empty($errors['warning_count'])) {
            return false;
        }
    }
    return $dateTime !== false;
}
55
bitWorking

Vous pouvez vérifier cette ressource: http://php.net/manual/en/datetime.getlasterrors.php

Les codes PHP sont les suivants:

try {
    $date = new DateTime('asdfasdf');
} catch (Exception $e) {
    print_r(DateTime::getLastErrors());
    // or
    echo $e->getMessage();
}
10
shadyyx

Avec DateTime, vous pouvez créer le validateur de date et d’heure le plus court pour tous les formats.

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

var_dump(validateDate('2012-02-28 12:12:12')); # true
var_dump(validateDate('2012-02-30 12:12:12')); # false

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

7
Faiyaz Alam

Essaye ça:

  function is_valid_date($date,$format='dmY')
  {
    $f = DateTime::createFromFormat($format, $date);
    $valid = DateTime::getLastErrors();         
    return ($valid['warning_count']==0 and $valid['error_count']==0);
  }
5
boctulus
$date[] = '20/11/2569';     
$date[] = 'lksdjflskdj'; 
$date[] = '11/21/1973 10:20:30';
$date[] = '21/11/1973 10:20:30';
$date[] = " ' or uid like '%admin%"; 
foreach($date as $dt)echo date('Y-m-d H:i:s', strtotime($dt))."\n";

Sortie

1970-01-01 05:30:00
1970-01-01 05:30:00
1970-01-01 05:30:00
1973-11-21 10:20:30
1970-01-01 05:30:00
1970-01-01 05:30:00
0
bluepinto