web-dev-qa-db-fra.com

Fonction pour vérifier si une chaîne est une date

J'essaye d'écrire une fonction pour déterminer si une chaîne est une date/heure en utilisant PHP. Fondamentalement, une date/heure valide ressemblerait à ceci:

 2012-06-14 01:46:28

Évidemment, même si ses valeurs sont complètement dynamiques, cela peut changer, mais il devrait toujours être sous la forme XXXX-XX-XX XX:XX:XX, comment puis-je écrire une expression régulière pour vérifier ce modèle et renvoyer true s’il correspond.

42
Justin

Si c'est toute votre chaîne, essayez simplement de l'analyser:

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

Voici une approche différente sans utiliser une expression régulière:

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

Si vous ne connaissez pas le format de date:

/**
 * 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
15
John Linhart

J'utilise cette fonction en tant que paramètre de la fonction PHP filter_var

  • Il vérifie les dates au format yyyy-mm-dd hh:mm:ss
  • Il rejette les dates qui correspondent au modèle mais qui ne sont toujours pas valides (par exemple, le 31 avril)

function filter_mydate($s) {
    if (preg_match('@^(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)$@', $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;
}
4
Salman A

Une version plus petite, cela pourrait aider:

if(strtotime($date_string)){
    // it's in date format
}
3
Yogesh Mistry

Bien que cela ait une réponse acceptée, cela ne fonctionnera pas efficacement dans tous les cas. Par exemple, je teste la validation de la date sur un champ de formulaire que j'ai avec la date "10/38/2013" et un objet DateObject valide a été renvoyé, mais la date correspond à ce que PHP appelle "débordé" de sorte 10/38/2013 "devient" 11/07/2013 ". Cela a du sens, mais devrions-nous simplement accepter la date modifiée ou obliger les utilisateurs à saisir la date correcte? Pour ceux d'entre nous qui sommes des nazis de validation de formulaire, nous pouvons utiliser ce correctif: https://stackoverflow.com/a/10120725/486863 et renvoyer juste false lorsque l'objet lève cet avertissement.

L'autre solution consiste à faire correspondre la date de chaîne à celle formatée et à comparer les deux pour une valeur égale. Cela semble tout aussi compliqué. Tant pis. Telle est la nature de PHP dev.

3
cj5

Je ne voudrais pas utiliser de regex pour cela, mais plutôt simplement scinder la chaîne et vérifier que la date est valide

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

strtotime? Des listes? Expressions régulières?

Quel est le problème avec l'objet DateTime natif de PHP?

http://www.php.net/manual/en/datetime.construct.php

0
Sherlock

Dans mon projet, cela semble fonctionner:

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

Si vous êtes prêt à utiliser regEx, txt2re.com est toujours une bonne ressource:

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

?>
0
PT114
 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

0
José Rodrigues

Si vous avez PHP 5.2, la réponse de Joey ne fonctionnera pas. Vous devez étendre la classe DateTime de PHP:

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

et que vous pouvez utiliser cette classe sans problèmes:

ExDateTime::createFromFormat('d.m.Y G:i',$timevar);
0
MERT DOĞAN

if (strtotime ($ date)> strtotime (0)) {echo 'c'est une date'}

0
emmanuel