Page 1 sur 1

Comparer une date avec la date du jour !

Posté : 20 janv. 2007, 14:12
par Sebe
Bonjour,

J'ai trouvé un script sur le net que j'ai dû un peu modifier pour les besoins. Ce script prend une date, regarde sa validité et la renvoit soit au format EU ou US (très intéressant pour plus tard !).
J'aimerai compliquer un peu plus en m'assurant que cette date se trouve bien aujourd'hui au plus tard ... c'est pour un test et je vois mal que l'on donne les résultat aujourd'hui hors qu'il est fait demain !

Voici mon script de base:

Code : Tout sélectionner

// **************************** Fonction 'Vérification date test' *************************** <!-- Original: Mike Welagen ([email protected]) --> <!-- This script and many more are available free online at --> <!-- The JavaScript Source!! http://javascript.internet.com --> function checkdate(objName) { var datefield = objName; if (chkdate(objName) == false) { datefield.select(); alert("La date n'est pas valide !"); datefield.focus(); return false; } else { return true; } } function chkdate(objName) { // var strDatestyle = "US"; //United States date style var strDatestyle = "EU"; //European date style var strDate; var strDateArray; var strDay; var strMonth; var strYear; var intday; var intMonth; var intYear; var booFound = false; var datefield = objName; var strSeparatorArray = new Array("-"," ","/","."); var intElementNr; var err = 0; var strMonthArray = new Array(12); strMonthArray[0] = "01"; strMonthArray[1] = "02"; strMonthArray[2] = "03"; strMonthArray[3] = "04"; strMonthArray[4] = "05"; strMonthArray[5] = "06"; strMonthArray[6] = "07"; strMonthArray[7] = "08"; strMonthArray[8] = "09"; strMonthArray[9] = "10"; strMonthArray[10] = "11"; strMonthArray[11] = "12"; strDate = datefield.value; if (strDate.length < 1) { return true; } for (intElementNr = 0; intElementNr < strSeparatorArray.length; intElementNr++) { if (strDate.indexOf(strSeparatorArray[intElementNr]) != -1) { strDateArray = strDate.split(strSeparatorArray[intElementNr]); if (strDateArray.length != 3) { err = 1; return false; }else { strDay = strDateArray[0]; strMonth = strDateArray[1]; strYear = strDateArray[2]; } booFound = true; } } if (booFound == false) { if (strDate.length>5) { strDay = strDate.substr(0, 2); strMonth = strDate.substr(2, 2); strYear = strDate.substr(4); } } if (strYear.length == 2) { strYear = '20' + strYear; } // US style if (strDatestyle == "US") { strTemp = strDay; strDay = strMonth; strMonth = strTemp; } intday = parseInt(strDay, 10); if (isNaN(intday)) { err = 2; return false; } intMonth = parseInt(strMonth, 10); if (isNaN(intMonth)) { for (i = 0;i<12;i++) { if (strMonth.toUpperCase() == strMonthArray[i].toUpperCase()) { intMonth = i+1; strMonth = strMonthArray[i]; i = 12; } } if (isNaN(intMonth)) { err = 3; return false; } } intYear = parseInt(strYear, 10); if (isNaN(intYear)) { err = 4; return false; } if (intMonth>12 || intMonth<1) { err = 5; return false; } if ((intMonth == 1 || intMonth == 3 || intMonth == 5 || intMonth == 7 || intMonth == 8 || intMonth == 10 || intMonth == 12) && (intday > 31 || intday < 1)) { err = 6; return false; } if ((intMonth == 4 || intMonth == 6 || intMonth == 9 || intMonth == 11) && (intday > 30 || intday < 1)) { err = 7; return false; } if (intMonth == 2) { if (intday < 1) { err = 8; return false; } if (LeapYear(intYear) == true) { if (intday > 29) { err = 9; return false; } }else { if (intday > 28) { err = 10; return false; } } } if (strDatestyle == "US") { datefield.value = strMonthArray[intMonth-1] + "-" + intday+"-" + strYear; }else { datefield.value = intday + "-" + strMonthArray[intMonth-1] + "-" + strYear; } return true; } function LeapYear(intYear) { if (intYear % 100 == 0) { if (intYear % 400 == 0) { return true; } } else { if ((intYear % 4) == 0) { return true; } } return false; } // **************************** Fin de la fonction 'Vérification date test' ***************************
Que dois-je ajouter?

Merci

Posté : 20 janv. 2007, 14:52
par Ajoloca
Bonjour,

Je ne vais pas te donner le code, mais une façon de procéder.

Tes deux dates doivent avoir la même structure
AAAA => Année sur 4 chiffres
MM => Le mois sur deux chiffres
JJ => Le jour sur deux chiffres

Tu concatènes les valeurs (dans l'ordre année, mois, jour), ça doit te donner AAAAMMJJ, Exp. 20070120 (aujourd'hui)
L'autre date (hier) 20070119.

Comme tu le remarques la valeur d'aujourd'hui est plus grande que celle d'hier.

C'est tout simple.

Posté : 20 janv. 2007, 15:07
par Sebe
Re,

Le principe est assez simple ... j'aurai dû y penser !
Juste une question pour récupérer la vrai date du jour:
Il faut que je fasse une récupération via un champs masqué du type
<input name="hiddenField" type="hidden" value="<?php echo date('d-m-Y'); ?>" />
et faire la comparaison où y a-t-il un autre moyen ?

Autre chose, la date 01-02-2007 est transformée en 1-02-2007 ... j'ai un peu peur du problème qu'il pourrait y avoir pour l'ordre de grandeur !

Encore un truc: et si le PC du visiteur n'est pas à la bonne date ???

Merci

Posté : 20 janv. 2007, 15:41
par Ajoloca
Re,

Si le PC du visiteur n'est pas à la bonne date, bein ....
Autre chose, la date 01-02-2007 est transformée en 1-02-2007
Comme je te l'ai dit, tu dois tout mettre au bon format (poste précédent)
Tu as des caractères(au départ) qui te permettent de différencier chaque partie (le - dans ton cas).

Tu dois donc pouvoir le faire en testant sur la longueur de chaque partie, si la longueur n'est pas bonne :

Dans le cas du jour et du mois tu concatènes devant un 0 à la valeur.
Dans le cas de l'année c'est en fonction de ce que tu vas traiter (19.. ou seulement depuis 20..)

Posté : 21 janv. 2007, 00:41
par Sebe
Si le PC du visiteur n'est pas à la bonne date, bein ....
Evidement, il risque d'avoir plus de problème en ajoutant ce confort ... je pense bien laisser ainsi ! J'ai la nuit et elle porte conseille ! ! !

Merci

Posté : 21 janv. 2007, 12:15
par Ryle
Encore un truc: et si le PC du visiteur n'est pas à la bonne date ???
Commandement n°3 : Point ne te fieras aux données soumises par l'utilisateur ! ;)

Pas de soucis à avoir dans ton cas puisque la date du jour est déterminée par php, elle correspond donc à la date du serveur qui lui sera normalement toujours à jour, et pas à celle de l'utilisateur qu'il peut facilement modifier :)

Posté : 21 janv. 2007, 12:55
par Sebe
Pas de soucis à avoir dans ton cas puisque la date du jour est déterminée par php, elle correspond donc à la date du serveur qui lui sera normalement toujours à jour, et pas à celle de l'utilisateur qu'il peut facilement modifier :)
Juste, j'ai confondu car au début j'étais partit sur un retour de date en JavaScript ... vais pouvoir m'y remettre !

Merci

Posté : 22 janv. 2007, 00:45
par Sebe
Voilà j'ai fait et cela fonctionne ... voici mon code:

Code : Tout sélectionner

function jourTest (){ var dateserveur = document.forms.test.dateserveur.value; //alert ("La date du serveur est " + dateserveur); jourserveur = dateserveur.substring(0,2); moisserveur = dateserveur.substring(3,5); anneeserveur = dateserveur.substring(6,10); serveur = anneeserveur+moisserveur+jourserveur; //alert ("La date du serveur " + serveur); var datetest = document.forms.test.datetest.value; //alert ("La date du test est " + datetest); jourtest = datetest.substring(0,2); moistest = datetest.substring(3,5); anneetest = datetest.substring(6,10); test = anneetest+moistest+jourtest; //alert ("La date du test " + test); if (test > serveur){ alert ("Le test ne peut s'être déroulé à une date qui n'a pas encore existée ! ! !"); document.forms.test.datetest.focus(); } }
Quelque fois que vous veriez une amélioration possible ... !

Merci beaucoup

Posté : 22 janv. 2007, 01:18
par Ajoloca
Bonsoir,

Pourquoi utiliser des substring() à la place de split()
Exemple

Code : Tout sélectionner

function jourTest (){ var dateserveur = document.forms.test.dateserveur.value.split("-"); var serveur = dateserveur[2] +''+dateserveur[1]+''+dateserveur[0]; var datetest = document.forms.test.datetest.value.split("-"); var test = datetest[2]+''+datetest[1]+''+datetest[0]; if (test > serveur){ alert ("Le test ne peut s'être déroulé à une date qui n'a pas encore existée ! ! !"); document.forms.test.datetest.focus(); } }

Posté : 22 janv. 2007, 09:42
par Sebe
Salut,
Pourquoi utiliser des substring() à la place de split()
Exemple
Simplement parce que je suis apprentit sorcier et non programmeur ... j'ai lu et c'est le 1er truc sur lequel je suis tombé !

Peux-tu me dire quelle sera la différence entre les 2 ?

Merci

Posté : 22 janv. 2007, 14:03
par Ajoloca
Bonjour,
Comme tu le vois, l'exemple que je t'ai donné est loin d'être complet pour faire une programmation propre.
Avec cette solution, tu peut tester la longueur de chaque champ et la mettre en conformité, avec substring() non.
Exemple : Si l'utilisateur saisi 1-1-2007 (qui est une date valide) avec split() tu peux la traiter sans souci,
par contre avec substring() ça "plante" (pas suffisamment de caractères dans la chaine).
La rapidité d'exécution, la simplicité de programmation, ....

Posté : 22 janv. 2007, 14:16
par Sebe
Avec cette solution, tu peut tester la longueur de chaque champ et la mettre en conformité, avec substring() non.
Exemple : Si l'utilisateur saisi 1-1-2007 (qui est une date valide) avec split() tu peux la traiter sans souci,
par contre avec substring() ça "plante" (pas suffisamment de caractères dans la chaine).
Pour une raison esthétique, j'avais déjà réflichi à mettre ma date au format jj/mm/aaaa dans une autre fonction qui vérifie la validité de la date ... à la différence de celle sui nous concerne (qui compare)! Je pense même les grouper mais peut-être plus tard !
La rapidité d'exécution, la simplicité de programmation, ....
Alors, y-a plus de question à se poser !

Merci

Posté : 22 janv. 2007, 14:26
par Sebe
C'est on line dans mon blog
Merci