84 votes

Fonction permettant de vérifier si une chaîne de caractères est une date

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

 2012-06-14 01:46:28

Il est évident qu'il est totalement dynamique et que toutes les valeurs peuvent changer, mais il doit toujours se présenter sous la forme de XXXX-XX-XX XX:XX:XX Comment puis-je écrire une expression régulière qui vérifie la présence de ce motif et renvoie un résultat positif en cas de correspondance ?

0voto

PT114 Points 911

Si vous tenez absolument à 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";
  }

?>

0voto

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

a été copiée à partir de cette fonction répondre o php.net

0voto

MERT DOĞAN Points 201

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 vous pourrez ensuite utiliser cette classe sans problème :

ExDateTime::createFromFormat('d.m.Y G:i',$timevar);

0voto

Cette solution me convient, mais je pense qu'elle pose également d'autres problèmes.

function validateTimeString($datetime, $format = "Y-m-d H:i:s"){
   return ($datetime == date($format, strtotime($datetime)));
 }

0voto

arno Points 149

Lorsque je travaille avec des API non conventionnelles, j'obtiens parfois un retour un peu désordonné au lieu d'un format de date bien défini. J'utilise donc une classe plutôt inélégante et j'admets volontiers qu'elle est brutale et non conventionnelle dans son principe, mais elle me fait du bien parfois ^^.

class DateHelper
{
    private const DATE_FORMATS = [
        DATE_ATOM,
        DATE_COOKIE,
        DATE_RFC822,
        DATE_RFC850,
        DATE_RSS,
        DATE_W3C,
        "Y-m-d\TH:i:s.u",
        'Y-m-d\TH:i:s',
        "Y-m-d'T'H:i:s.SSS'Z'",
        "Y-m-d\TH:i:s.uP",
        "Y-m-d\TH:i:sP",
        "d/m/Y H:i:s",
    ];

    /**
     * @param string $inputStringDate
     * @return DateTime|null
     */
    public static function createDateFromUnknownFormat(string $inputStringDate): ?DateTime
    {
        $inputStringDate = str_replace('/', '-', $inputStringDate);
        preg_match('/^(\d{4})\-(\d{2})-(\d{2})$/', $inputStringDate, $result);
        if (!empty($result)) {
            return DateTime::createFromFormat('Y-m-d', $inputStringDate);
        }
        preg_match('/^(\d{2})\-(\d{2})-(\d{4})$/', $inputStringDate, $result);
        if (!empty($result)) {
            return DateTime::createFromFormat('d-m-Y', $inputStringDate);
        }
        foreach (self::DATE_FORMATS as $dateFormat) {
            if ($dateObject = DateTime::createFromFormat($dateFormat, $inputStringDate)) {
                return $dateObject;
            }
        }
        return null;
    }
}

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