Comparer une date avec la date du jour !

Mammouth du PHP | 545 Messages

20 janv. 2007, 14:12

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
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

ViPHP
ViPHP | 1961 Messages

20 janv. 2007, 14:52

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.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 545 Messages

20 janv. 2007, 15:07

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
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

ViPHP
ViPHP | 1961 Messages

20 janv. 2007, 15:41

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..)
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 545 Messages

21 janv. 2007, 00:41

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
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

21 janv. 2007, 12:15

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 545 Messages

21 janv. 2007, 12:55

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
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Mammouth du PHP | 545 Messages

22 janv. 2007, 00:45

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
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

ViPHP
ViPHP | 1961 Messages

22 janv. 2007, 01:18

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(); } }
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 545 Messages

22 janv. 2007, 09:42

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
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

ViPHP
ViPHP | 1961 Messages

22 janv. 2007, 14:03

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, ....
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 545 Messages

22 janv. 2007, 14:16

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
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Mammouth du PHP | 545 Messages

22 janv. 2007, 14:26

C'est on line dans mon blog
Merci
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!