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 ?

583voto

Amal Murali Points 37729

Vous pouvez utiliser DateTime::createFromFormat() à cette fin :

function validateDate($date, $format = 'Y-m-d')
{
    $d = DateTime::createFromFormat($format, $date);
    // The Y ( 4 digits year ) returns TRUE for any integer with any number of digits so changing the comparison from == to === fixes the issue.
    return $d && $d->format($format) === $date;
}

[ Fonction tirée de cette réponse . Également sur php.net . Rédigé à l'origine par Glavic . ]


Cas de test :

var_dump(validateDate('2013-13-01'));  // false
var_dump(validateDate('20132-13-01')); // false
var_dump(validateDate('2013-11-32'));  // false
var_dump(validateDate('2012-2-25'));   // false
var_dump(validateDate('2013-12-01'));  // true
var_dump(validateDate('1970-12-01'));  // true
var_dump(validateDate('2012-02-29'));  // true
var_dump(validateDate('2012', 'Y'));   // true
var_dump(validateDate('12012', 'Y'));  // false

Démonstration !

99voto

arsh Points 1064

Déterminer si une chaîne de caractères est une date

function checkIsAValidDate($myDateString){
    return (bool)strtotime($myDateString);
}

48voto

chotesah Points 11

L'utilisation est simple grâce aux fonctions php pré-intégrées :

function checkmydate($date) {
  $tempDate = explode('-', $date);
  // checkdate(month, day, year)
  return checkdate($tempDate[1], $tempDate[2], $tempDate[0]);
}

Test

   checkmydate('2015-12-01'); //true
   checkmydate('2015-14-04'); //false

19voto

migli Points 755

Déterminer si la chaîne est une date, même si la chaîne a un format non standard

(strtotime n'accepte aucun format personnalisé)

<?php
function validateDateTime($dateStr, $format)
{
    date_default_timezone_set('UTC');
    $date = DateTime::createFromFormat($format, $dateStr);
    return $date && ($date->format($format) === $dateStr);
}

// These return true
validateDateTime('2001-03-10 17:16:18', 'Y-m-d H:i:s');
validateDateTime('2001-03-10', 'Y-m-d');
validateDateTime('2001', 'Y');
validateDateTime('Mon', 'D');
validateDateTime('March 10, 2001, 5:16 pm', 'F j, Y, g:i a');
validateDateTime('March 10, 2001, 5:16 pm', 'F j, Y, g:i a');
validateDateTime('03.10.01', 'm.d.y');
validateDateTime('10, 3, 2001', 'j, n, Y');
validateDateTime('20010310', 'Ymd');
validateDateTime('05-16-18, 10-03-01', 'h-i-s, j-m-y');
validateDateTime('Monday 8th of August 2005 03:12:46 PM', 'l jS \of F Y h:i:s A');
validateDateTime('Wed, 25 Sep 2013 15:28:57', 'D, d M Y H:i:s');
validateDateTime('17:03:18 is the time', 'H:m:s \i\s \t\h\e \t\i\m\e');
validateDateTime('17:16:18', 'H:i:s');

// These return false
validateDateTime('2001-03-10 17:16:18', 'Y-m-D H:i:s');
validateDateTime('2001', 'm');
validateDateTime('Mon', 'D-m-y');
validateDateTime('Mon', 'D-m-y');
validateDateTime('2001-13-04', 'Y-m-d');

17voto

galki Points 1593

Cette option n'est pas seulement simple, elle accepte aussi presque tous les formats, bien qu'elle puisse être boguée dans le cas de formats non standard.

$timestamp = strtotime($date);
return $timestamp ? $date : 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