Tester la validité d’une date en JavaScript et PHP

Généralement, on utilise une expression rationnelle pour vérifier que la syntaxe d’une date corresponde bien au résultat que l’on attend.

Mais il faut aussi tester que la date soit valide : le mois ne doit pas dépasser 12, le jour ne doit pas dépasser le nombre de jours du mois, etc.

Tester si l’année est bissextile

Une année bissextile contient un jour de plus qu’une année normale. Elle comporte un 29 février et possède donc 366 jours au lieu de 365.

Pour savoir si une année est bissextile, elle doit remplir l’un ou l’autre des critères suivants :

  • Elle est divisible par 4, mais non divisible par 100
  • Elle est divisible par 400

Il suffit donc d’écrire une fonction qui teste si l’année vérifie l’un ou l’autre de ces critères :

function is_leap_year(year) {
return( (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0 );
}

Que vous utiliserez comme ceci :

var year = 1992;
 
if (is_leap_year(1992)) {
 console.log(year + " est une année bissextile.");
} else {
 console.log(year + " n'est pas une année bissextile.");
}

L’équivalent en PHP coule de source :

function is_leap_year($year) {
return( ($year % 4 === 0 && $year % 100 !== 0) || $year % 400 === 0 );
}

Tester la validité de la date

Ici on ne parlera pas de tester la syntaxe de la date, mais bien si la date est valide. Pour la syntaxe, il suffit d’utiliser une expression rationnelle.

Pour qu’une date soit valide elle doit répondre aux critères suivants :

  • le mois doit être une valeur comprise entre 1 et 12
  • le jour ne doit pas être plus grand que 31
  • le jour ne doit pas être plus grand que 30 pour les mois 4, 6, 9, et 11
  • si le mois est février, le jour ne doit pas être plus grand que 29, ni plus grand que 28 pour les années non bissextiles

La fonction qui teste ces critères :

function is_valid_date(year, month, day) {
 
 // le mois doit être une valeur comprise entre 1 et 12
 if (month < 1 || month > 12)
  return false;
 
 // le jour ne doit pas être plus grand que 31
 if (day > 31)
  return false;
 
 // le jour ne doit pas être plus grand que 30 pour les mois 4, 6, 9, et 11
 if ((month == 4 || month == 6 || month == 9 || month == 11) && day > 30)
  return false;
 
 // si le mois est février...
 if (month == 2) {
  // le jour ne doit pas être plus grand que 29, ni plus grand que 28 pour les années non bissextiles
  if( (day > 29) || (!is_leap_year(year) && day > 28) )
   return false;
 }
 
 return true;
}

Que vous utiliserez comme ceci :

var year = 1992;
var month = 02;
var day = 29;
 
if (is_valid_date(year, month, day)) {
 console.log(day + "/" + month + "/" + year + " est une date valide.");
} else {
 console.log(day + "/" + month + "/" + year + " n'est pas une date valide.");
}

En PHP il existe une fonction qui teste la date pour vous : checkdate()

Elle s’utilise simplement comme ceci :

$year = 1992;
$month = 02;
$day = 29;
 
if (checkdate($month, $day, $year)) {
 echo $day . "/" . $month . "/" . $year + " est une date valide.";
} else {
 echo $day . "/" . $month . "/" . $year + " n'est pas une date valide.";
}

One Comment on "Tester la validité d’une date en JavaScript et PHP"

  1. Mello dit :

    Scusez pour le premier message une fausse manip

    J’ai pas mal chercher de fonction qui permette de vérifier la validité d’une date sur notre ami google et j’ai pas réussi a en trouver de simple et efficace (y compris celle-ci). Je me suis donc lancer dans la création de ma fonction qui me semble simple et relativement claire. Je me permet de la poster ici en espérant que ça puisse en aider certain :

    function checkDate(_date) {
    reg = new RegExp(/^[0-3]{1}[0-9]{1}[\/][0-1]{1}[0-9]{1}[\/][0-9]{4}$/);
    if(!reg.test(_date)){ // VERIFICATION DU FORMAT JJ/MM/AAAA
    return false;
    }
    tabDate = _date.split(‘/’);
    dateTest = new Date(tabDate[2], tabDate[1] – 1, tabDate[0]);
    if(parseInt(tabDate[0], 10) != parseInt(dateTest.getDate(), 10)
    || parseInt(tabDate[1], 10) != parseInt(dateTest.getMonth(), 10) + parseInt(1, 10)
    || parseInt(tabDate[2], 10) != parseInt(dateTest.getFullYear(), 10) ){ // VERIFICATION DE L’EXSISTANCE
    return false;
    }
    return true;
    }

Got something to say? Go for it!

This site uses KeywordLuv. Enter YourName@YourKeywords in the Name field to take advantage.