Valider une date entrée dans un input text sans ajouter de séparateurs : jmaa, jmaaaa etc...

Soyez le premier à donner votre avis sur cette source.

Vue 8 105 fois - Téléchargée 249 fois

Description

Valider une date entrée dans un input text sous la forme : jmaa, jmaaaa, jmmaa, jmmaaaa, jjmaa, jjmaaaa, jjmmaa, ou bien jjmmaaaa
et qui est supérieure ou égale au 01/01/1800.

Normalement fonctionne sous IE, sous NS pas testé...

REMARQUE(S) :
1. L'utilisation de séparateurs (- / _ etc...) est facultative.

Source / Exemple :


function date_valid(iText)
	{
	iVal = iText.value;
	
	regT = new Array(
		/^([1-9])\D?([1-9])\D?((18|19|20)?\d{2})$/, // ex : 5 5 1800, 1 1 2002 (05-05-1800, 01-01-2002)
		/^([1-9])\D?(1[0-2])\D?((18|19|20)?\d{2})$/, // ex : 5 11 1800, 1 10 2002 (05-11-1800, 01-10-2002)
		/^([1-3]0)\D?([1-9])\D?((18|19|20)?\d{2})$/, // ex : 10 3 2001, 30 6 1911 (10-03-2001, 30-06-1911)
		/^(0[1-9]|[1-3][1-9])\D?([1-9])\D?((18|19|20)?\d{2})$/, // ex : 09 3 2001, 31 6 1911 (09-03-2001, 31-06-1911)
		/^(0[1-9]|[1-3][0-9])\D?(0[1-9]|1[0-2])\D?((18|19|20)?\d{2})$/ // ex : 10 02 2000, 39 12 1999 (10-02-2000, 39-12-1999)
		);
	
	if(iVal)
		{
		isReg=false;
		for(i=0; i<regT.length; i++)
			if( isReg = regT[i].test(iVal) )
				{
				regT[i].exec(iVal);
				break;
				}

		if(isReg)
			{
        		d = RegExp.$1; m = RegExp.$2; y = RegExp.$3;
			theDate = new Date();
			if(d.length==1) d = '0'+d; if(m.length==1) m = '0'+m;
			if(y.length==2) y = ( y > String(theDate.getYear()).substr(2,2) ) ? '19'+y : '20'+y;
			iText.value = d+'-'+m+'-'+y;
			
			mT = new Array("janvier","février","mars","avril","mai","juin",
					"juillet","août","septembre","octobre","novembre","décembre");
			
			reg = /^(0?[1-9]|[1-3][0-9])\D?(0?[1-9]|1[0-2])\D?((18|19|20)\d{2})$/;		
			reg.exec(iText.value);
			if( parseInt(RegExp.$1) > nbJMonth(RegExp.$3,RegExp.$2) )
				{
        			alert('LA DATE ENTRÉE N\'EXISTE PAS...il y a '+nbJMonth(RegExp.$3,RegExp.$2)+' jours pour le mois de '+mT[RegExp.$2-1]+' ('+RegExp.$3+').');
        			iText.value = '-'+RegExp.$2+'-'+RegExp.$3;
        			iText.focus(); return;
        			}
                	}
                	else
                	{
        		alert('FORMAT DE DATE ERRONÉ...\n\nLes formats valides sont :\n\tjmaa\n\tjmaaaa\n\tjmmaa\n\tjmmaaaa\n\tjjmaa\n\tjjmaaaa\n\tjjmmaa\n\tjjmmaaaa \net où l\'année est supérieure à 1800.\n\n\nREMARQUE(S) :\n1. L\'utilisation de séparateurs (- \/ _ etc...) est facultative.');
        		iText.focus(); return;
        		}
        	}
	}
	
	function isBissext(theY) { return ( theY % 4 == 0 && (theY % 100 !=0 || theY % 400 ==0) ); }
	function nbJMonth(theY,theM)
		{ 
		jpm = ['',31,[28,29],31,30,31,30,31,31,30,31,30,31];
		theM = parseInt(theM);
		if(theM==2) return isBissext(theY) ? jpm[theM][1] : jpm[theM][0];
		else return jpm[theM];
		}

Conclusion :


Merci d'avance pour vos suggestions d'améliorations, pour les bugs qui peuvent se présenter, etc...

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1
Date d'inscription
mardi 10 avril 2007
Statut
Membre
Dernière intervention
27 octobre 2009

Attention ! Le bug signalé par GARONORD n'est pas corrigé à ce jour. Ce script serait intéressant à corriger. Chuis pas assez bon pour ça mais ça m'intéresse terriblement. Alors si, depuis 2003 et 2005 quelqu'un est passé par là ... je pense que ça vaut le coup de s'y intéresser. Mais l'idée est super bonne. Bravo !
Messages postés
2
Date d'inscription
samedi 12 février 2005
Statut
Membre
Dernière intervention
16 mai 2005

bravo très bon travail mais il manque de prendre en considération les fautes de saisie telqu'un nombre sup à 31 génére un bug du script(en jour ou en mois).
Messages postés
3
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
27 mars 2003

J'ai effectué quelques tests, je voulais vous en faire part :
Voici les combinaisons de dates qui ne marchent pas :
du 01-08-XX au 31-08-XX
et du 01-09-XX au 07-09-XX et du 10-09-XX au 30-09-XX
Messages postés
3
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
27 mars 2003

merci Jojo pour ta diligence, en mettant nb_que_vous_voulez=99, le script répond exactement à ce que je veux (pour 1199 -> 01-01-2099, pour 1403->01-04-2003 etc)

malheureusement, je viens de me rendre contre d'un autre probleme, en saisissant des dates avec les mois d'aout et septembre, le script renvoi un message d'erreur incoherent (ex : pour 01092003, ou 01082018 etc)

ce bug est present sur les precedentes versions et avant la modif du script proposé le 21/03/2003 21:53:10 par jojo51

Y aurait il donc moyen de rendre ce script parfait ?

Merci d'avance en tout cas
Messages postés
2
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
21 mars 2003

Pour ceux qui souhaitent pouvoir entrer une date supérieure à la date
courante il suffit de remplacer la portion de code suivante :
( y > String(theDate.getYear()).substr(2,2) ) ? '19'+y : '20'+y;

par ( y > nb_que_vous_voulez ) ? '19'+y :'20'+y;

sinon vous pouvez toujours y incorporer une fonction perso retournant
la bonne année suivant votre propre test...

function dateYear(y)
{return (y > nb_que_vous_voulez) ? '19'+y : '20'+y;}

Merci pour vos commantaires ;-)
Afficher les 9 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.