ActionScript 3.0, l'essentiel sous la main Adobe Flash Accueil
Fiches
Boutique
Contact
Créer un formulaire - Validation d'une date
Voici une fonction qui vous permettra de valider le format d'une date (JJ/MM/AAAA), et si c'est une date réelle (jour dans le mois, année bisextile) :

function validation_date(date:String)
{
var validation = true;

//Test si on a bien 10 caractères
if(date.length != 10) { validation = false; }

//Décomposition de la date (JJ/MM/AAAA)
var jj = date.substr(0,2); //Extraction du jour
var mm = date.substr(3,2); //Extraction du mois
var aaaa = date.substr(6,4); //Extraction de l'année
var separateur_1 = date.substr(2,1); //Extraction du séparateur jj/mm
var separateur_2 = date.substr(5,1); //Extraction du séparateur mm/aaaa

//Test le format de la date
var format_jour:RegExp = /[0-9]{2}/; //Format du jour "JJ" = 2 caractères numériques en 0 et 9
var format_mois:RegExp = /[0-9]{2}/; //Format du mois "MM" = 2 caractères numériques en 0 et 9
var format_annee:RegExp = /[0-9]{4}/; //Format de l'année "AAAA" = 4 caractères numériques en 0 et 9
var format_separateurs = "/"; //Format des séparateurs "/" = 1 slash
if(jj.match(format_jour) == null) { validation = false; } //Test le format du jour
if(mm.match(format_mois) == null) { validation = false; } //Test le format du mois
if(aaaa.match(format_annee) == null) { validation = false; } //Test le format de l'année
if(separateur_1 != format_separateurs) { validation = false; } //Test le séparateur jj/mm
if(separateur_2 != format_separateurs) { validation = false; } //Test le séparateur mm/aaaa

//Test la validité de la date
if(validation == true) //Si la date est dans un format valide
{
var m31j = "01,03,05,07,08,10,12"; //Numéros des mois de 31 jours
var m30j = "04,06,09,11"; //Numéros des mois de 30 jours
var m28j = "02"; //Numéros des mois de 28 jours

//Conversion de la date en valeurs numériques
jj = parseInt(jj);
mm = parseInt(mm);
aaaa = parseInt(aaaa);

//Test si le mois est bien sur [1;12]
if(mm > 12) { validation = false; }

//Test si l'année est bisextile afin de savoir si il y a 29 jours dans le mois de Février
var bisextile = false;
if( ((aaaa & 3) == 0) && ((aaaa % 100 != 0) || (aaaa % 400 == 0)) ) { bisextile = true; }

//Test si le jour est bien sur [1;31]/[1;30]/[1;29]/[1;28] selon le mois et l'année
if( (m31j.indexOf(mm) != -1) && (jj > 31) ) { validation = false; } //[1;31]
if( (m30j.indexOf(mm) != -1) && (jj > 30) ) { validation = false; } //[1;30]
if( (m28j.indexOf(mm) != -1) && (jj > 28) && (bisextile == false) ) { validation = false; } //[1;28]
if( (m28j.indexOf(mm) != -1) && (jj > 29) && (bisextile == true) ) { validation = false; } //[1;29]
}

return validation;
}
trace(validation_date("31/03/2006")); //Renvoi true >> Format OK
trace(validation_date("2006/31/03")); //Renvoi false >> Format incorrect
trace(validation_date("31-03-2006")); //Renvoi false >> Les séparateurs doivent être des slash "/" et pas des tirets "-"
trace(validation_date("31/04/2006")); //Renvoi false >> En avril il n'y a que 30 jours
trace(validation_date("29/02/2006")); //Renvoi false >> En février il n'y a que 28 jours
trace(validation_date("29/02/2004")); //Renvoi true >> En février 2004 il y avait 29 jours car c'était une année bisextile

Libre à vous de modifier le code pour un autre format de date Ex : JJ-MM-AAAA, MM-JJ-AAAA, AAAA/JJ/MM, etc.
L'année fournit doit cependant toujours être à 4 chiffres avec cette fonction. Sinon, voici la fonction modifiée pour gérer une date au format JJ-MM-AA :

function validation_date(date:String)
{
var validation = true;

//Test si on a bien 8 caractères
if(date.length != 8) { validation = false; }

//Décomposition de la date (JJ-MM-AA)
var jj = date.substr(0,2); //Extraction du jour
var mm = date.substr(3,2); //Extraction du mois
var aaaa = date.substr(6,2); //Extraction de l'année
var separateur_1 = date.substr(2,1); //Extraction du séparateur jj/mm
var separateur_2 = date.substr(5,1); //Extraction du séparateur mm/aaaa

//Test le format de la date
var format_jour:RegExp = /[0-9]{2}/; //Format du jour "JJ" = 2 caractères numériques en 0 et 9
var format_mois:RegExp = /[0-9]{2}/; //Format du mois "MM" = 2 caractères numériques en 0 et 9
var format_annee:RegExp = /[0-9]{2}/; //Format de l'année "AA" = 2 caractères numériques en 0 et 9
var format_separateurs = "-"; //Format des séparateurs "-" = 1 tiret
if(jj.match(format_jour) == null) { validation = false; } //Test le format du jour
if(mm.match(format_mois) == null) { validation = false; } //Test le format du mois
if(aaaa.match(format_annee) == null) { validation = false; } //Test le format de l'année
if(separateur_1 != format_separateurs) { validation = false; } //Test le séparateur jj/mm
if(separateur_2 != format_separateurs) { validation = false; } //Test le séparateur mm/aaaa

//Test la validité de la date
if(validation == true) //Si la date est dans un format valide
{
var m31j = "01,03,05,07,08,10,12"; //Numéros des mois de 31 jours
var m30j = "04,06,09,11"; //Numéros des mois de 30 jours
var m28j = "02"; //Numéros des mois de 28 jours

//Transcription de l'année à 2 chiffres en année à 4 chiffres (valable uniquement pour des dates de 19xx et 20xx)
var tps:Date = new Date();
var annee_actu = tps.fullYear;
annee_actu = String(annee_actu);
annee_actu = annee_actu.substr(2,2);
if(aa > annee_actu){ aa = "19"+aa; } else { aa = "20"+aa; }

//Conversion de la date en valeurs numériques
jj = parseInt(jj);
mm = parseInt(mm);
aaaa = parseInt(aaaa);

//Test si le mois est bien sur [1;12]
if(mm > 12) { validation = false; }

//Test si l'année est bisextile afin de savoir si il y a 29 jours dans le mois de Février
var bisextile = false;
if( ((aaaa & 3) == 0) && ((aaaa % 100 != 0) || (aaaa % 400 == 0)) ) { bisextile = true; }

//Test si le jour est bien sur [1;31]/[1;30]/[1;29]/[1;28] selon le mois et l'année
if( (m31j.indexOf(mm) != -1) && (jj > 31) ) { validation = false; } //[1;31]
if( (m30j.indexOf(mm) != -1) && (jj > 30) ) { validation = false; } //[1;30]
if( (m28j.indexOf(mm) != -1) && (jj > 28) && (bisextile == false) ) { validation = false; } //[1;28]
if( (m28j.indexOf(mm) != -1) && (jj > 29) && (bisextile == true) ) { validation = false; } //[1;29]
}

return validation;
}

ATTENTION : cette fonction n'est valide que pour les dates du siècle actuel et le précédent, donc ici pour le 20e et le 21e siècle. Par exemple, une date de 18xx ou de 21xx ne marchera pas. Seules les dates de 19xx et 20xx marcheront aujoud'hui.
Commentaire(s)
Aucun.