Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

VALIDER UNE DATE ENTRÉE DANS UN INPUT TEXT SANS AJOUTER DE SÉPARATEURS : JMAA, JMAAAA ETC...


Information sur la source

Catégorie :Date & Heure Niveau : Initié Date de création : 22/02/2003 Date de mise à jour : 24/02/2003 14:57:23 Vu / téléchargé: 4 424 / 105

Note :
Aucune note

Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

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

  • 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];
  • }
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...              
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de dim3311 le 23/02/2003 12:43:50

Bonjour,

C'est une bonne idée. Une petite remarque, peut-être à la place de tester toutes les cominaisons de longueur j, m et a, tu pourrais les traiter un par un et ensuite faire une concatenation ? Ca reduirait ton code de moitié.

Salutations,
Dimitri

signaler à un administrateur
Commentaire de jojo51 le 23/02/2003 15:56:17

Merci à dim3311, pour ces conseils très pertinents...

Voici donc la source après modification...
Avec quelques lignes de moins...



signaler à un administrateur
Commentaire de garonord le 21/03/2003 11:45:54

ça ne marche pas, lorsque l'on rentre 010103, tout va bien, la date en sortie est 01-01-2003 mais  lorsque l'on rentre 010104 la date en sortie est 01-01-1904 alors qu'elle devrait etre 01-01-2004...

signaler à un administrateur
Commentaire de dim3311 le 21/03/2003 12:30:28

t'as raison, garonord
il faut introduire une variable globale de rupture de siecle pour les années sur deux chiffres, exemple
var LastCentury=35;

et attribuer le siècle 19 ou 20 en fonction de dépassement de l'année sur deux position de cette valeur

jojo - vas-y, un dernier effort  :)

signaler à un administrateur
Commentaire de jojo51 le 21/03/2003 21:53:10

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

par ( y &gt; 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 &gt; nb_que_vous_voulez) ?  '19'+y : '20'+y;}

Merci pour vos commantaires ;-)

signaler à un administrateur
Commentaire de garonord le 24/03/2003 14:11:32

merci Jojo pour ta diligence, en mettant  nb_que_vous_voulez=99, le script répond exactement à ce que je veux (pour 1199 -&gt; 01-01-2099, pour 1403-&gt;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

signaler à un administrateur
Commentaire de garonord le 27/03/2003 10:26:24

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

signaler à un administrateur
Commentaire de mkouki le 16/05/2005 14:12:12

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).

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,218 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.