Mara's dad a écrit :
Voilà une fonction de vérification / formatage de date en javascript
Elle est relativement intelligente, par exemple si tu saisi :
1 1 1
dans le champs, elle comprends :
1/1/2001
Dans le même ordre d'idée :
12 8 78 => 12/8/1978
120878 => 12/8/1978
12081978 => 12/8/1978
12/08/78 => 12/8/1978
...
En fais si année < 50 alors année = année + 2000.
Bien sûr tu as le droit de saisir les /
Exemple d'utilisation :
<input id="date_debut" onChange="javascript:return checkDate(this);" type="text" name=DateDebut" />
Mais rien n'empèche un utilisateur de passer outre, donc comme l'ont dit les autres, il faut un vérif coté serveur.
En fait j'ai le même fonction en PHP
// Vérifie qu'une date est bien saisie dans le format JJ/MM/AAAA
// oDateToCheck est l'objet champs à vérifier
function checkDate( oDateToCheck )
{
var dDate; // Utilisé pour générer un objet Date
var nDate; // Utilisé pour générer une référence temporelle numérique !
var aDate; // Tableau des éléments du champs de saisie séparés par de "/"
// Messages d'erreur. var sErrFormat = "La date doit être saisie dans le format JJ/MM/AAAA !";
var sErrFormatJour = "Le jour doit être compris entre 1 et 31 !";
var sErrFormatMois = "Le mois doit être compris entre 1 et 12!";
var sErrFormatAnnee = "L'année doit être sur 1,2 ou 4 chiffres !";
// Suppression des espaces du début
oDateToCheck.value = oDateToCheck.value.replace( /^\s+/, "" );
// Suppression des espaces de fin
oDateToCheck.value = oDateToCheck.value.replace( /\s+$/, "" );
// Remplacement des espaces par des /
oDateToCheck.value = oDateToCheck.value.replace( /\s+/, "/" );
oDateToCheck.value = oDateToCheck.value.replace( /\s+/, "/" );
oDateToCheck.value = oDateToCheck.value.replace( /\s+/, "/" );
oDateToCheck.ok = false;
//cas d'une date vide
if( oDateToCheck.value == "" )
{
oDateToCheck.ok = true;
return true;
}
// Séparation des éléments de la date.
aDate = oDateToCheck.value.split( "/" );
// On vérifie qu'on a bien 3 éléments if( aDate.length != 3 )
{
// S'il n'y as pas de /, on découpe la chaine en 3 si sa longueur est 6 ou 8
if( aDate.length == 1 )
{
if( oDateToCheck.value.length == 6 )
{
aDate[0] = oDateToCheck.value.substr( 0, 2);
aDate[1] = oDateToCheck.value.substr( 2, 2);
aDate[2] = oDateToCheck.value.substr( 4, 2);
}
else if( oDateToCheck.value.length == 8 )
{
aDate[0] = oDateToCheck.value.substr( 0, 2);
aDate[1] = oDateToCheck.value.substr( 2, 2);
aDate[2] = oDateToCheck.value.substr( 4, 4);
}
else
{
alert( sErrFormat );
return false;
}
}
else
{
alert( sErrFormat );
return false;
}
}
// On vérifie que c'est bien des nombres
if( isNaN( aDate[0] ) || isNaN( aDate[1] ) || isNaN( aDate[2] ) )
{
alert( sErrFormat );
return false;
}
// Vérification grossière sur le jour
if( aDate[0] > 31 || aDate[0] < 1 )
{
alert( sErrFormatJour );
return false;
}
// Vérification du mois
if( aDate[1] > 12 || aDate[1] < 1 )
{
alert( sErrFormatMois );
return false;
}
// Vérifier que l'année est bien sur 1, 2 ou 4 chiffres
if( aDate[2].length != 1 && aDate[2].length != 2 && aDate[2].length != 4 )
{
alert( sErrFormatAnnee );
return false;
}
// Si l'année est sur 1 ou 2 chiffres, on la remet sur 4
if( aDate[2] < 50 )
{
aDate[2] = 2000 + parseInt( aDate[2] );
}
else
{
if( aDate[2] >= 50 && aDate[2] < 100 )
{
aDate[2] = 1900 + parseInt( aDate[2] );
}
}
// Création d'une référence temporelle numérique à partir des élémentnt de la date nDate = Date.parse( aDate[1] + "/" + aDate[0] + "/" + aDate[2] );
// Vérification que la référence temporelle est une date valide
if( isNaN( nDate ) )
{
alert( oDateToCheck.value + " n'est pas une date valide !" );
return false;
}
else
{
// On renvoie la date formatée
dDate = new Date( nDate )
oDateToCheck.value = dDate.getDate() + "/" + ( dDate.getMonth() + 1 ) + "/" + dDate.getFullYear();
oDateToCheck.ok = true;
return true;
}
} |
Remarque, une date vide est considérée comme bonne !
Le champs était facultatif dans mon appli.
|