Probleme calcul date

Résolu/Fermé
moon136 Messages postés 71 Date d'inscription samedi 12 août 2017 Statut Membre Dernière intervention 17 avril 2018 - 26 sept. 2017 à 00:56
moon136 Messages postés 71 Date d'inscription samedi 12 août 2017 Statut Membre Dernière intervention 17 avril 2018 - 6 oct. 2017 à 20:23
Bonjour,

Salut dans le script ya un soucis de date.par exemplar quand on rentre la date du 01/01/2000, on se rend compte que le calcul n'est pas correct : il indique 16 ans et pas 17ans.


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Calcul de l'âge</title>
<script language="JavaScript">

function CheckDate(d) {
      var amin=1900; 
      var amax=2500; 
      var separateur="/";
      var j=(d.substring(0,2));
      var m=(d.substring(3,5));
      var a=(d.substring(6));
      var ok=1;
      if ( ((isNaN(j))||(j<1)||(j>31)) && (ok==1) ) {
         alert("Le jour n'est pas correct."); ok=0;
      }
      if ( ((isNaN(m))||(m<1)||(m>12)) && (ok==1) ) {
         alert("Le mois n'est pas correct."); ok=0;
      }
      if ( ((isNaN(a))||(a<amin)||(a>amax)) && (ok==1) ) {
         alert("L'année n'est pas correcte."); ok=0;
      }
      if ( ((d.substring(2,3)!=separateur)||(d.substring(5,6)!=separateur)) && (ok==1) ) {
         alert("Les séparateurs doivent être des "+separateur); ok=0;
      }
      if (ok==1) {
         var d2=new Date(a,m-1,j);
         j2=d2.getDate();
         m2=d2.getMonth()+1;
         a2=d2.getYear();
         if (a2<=100) {a2=1900+a2}
         if ( (j!=j2)||(m!=m2)||(a!=a2) ) {
            ok=0;
         }
		 ok=d2;
      }
      return ok;
   }



function tjs_age() {
	var dt_naissance = document.getElementById("dt_naissance");
	var dt = dt_naissance.value;
	var d = CheckDate(dt);
	var m = new Date();
	var age=""; 
	var age_a=0;var age_m=0;
	if (d!=0) {
		if (d.getTime()>m.getTime()) {
			age="La date de naissance est supérieure à la date du jour !";
			dt_naissance.focus();
		}
		age_a = m.getFullYear()-d.getFullYear();
		m.setYear(d.getYear());
		if ((d.getTime()>m.getTime())&&(d.getMonth()-m.getMonth()!=0)) {age_a--;}
		if (d.getMonth() >= m.getMonth()) {
			age_m = 12 - (d.getMonth()-m.getMonth())
		} else {
			age_m = (m.getMonth()-d.getMonth())
		}
		if (age_m==12) {age_m=0;}
		if (age_a==1) { age=age_a+" an"}
		if (age_a>1) { age=age_a+" ans"}
		if ((age_a>0)&&(age_m>0)) {age+=" et "}
		if (age_m>0) {age+=age_m+" mois"}
		if (age=="") { age="moins de 1 mois"}
		age  = 'Age = '+age;
		if (age_a>0 && d.getDate()==m.getDate() && d.getMonth()==m.getMonth()) { age= "Joyeux Anniversaire\n"+age;}
	    
	} else {
		dt_naissance.focus();
	}
	alert(age);
}

window.addEventListener("load", function () {
    document.getElementById("envoyer").addEventListener("click", tjs_age);
});
</script>


</head>
<body>
<center>
  <big><b>Calcul de l'âge</b></big>
</center>
<br>
<form name="formage">
  Entrez votre date de naissance (JJ/MM/AAAA) :
  <input id="dt_naissance" name="dt_naissance" size="10" maxlength="10" type="text">
  <input value="Calcul de l'âge" type="button" id="envoyer">
</form>
</body>
</html>


Merci de votre aide
A voir également:

3 réponses

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
26 sept. 2017 à 08:52
Bonjour,

Je n'ai pas tout compris à ton raisonnement, et notamment au m.setYear.
Je te déconseille d'utiliser une même variable pour gérer plusieurs informations différentes (tu le fais sur ce "m", tu le fais aussi plus haut avec le "ok"). Et nomme tes variables de façon explicite, tu t'y perdras moins.

De façon générale, pour calculer l'âge d'une personne, on regarde les jours du mois : si le jour anniversaire est inférieur au jour courant, on fait la différence ; sinon, on prend le complément à 30 et on enlève un mois.
Puis on regarde les mois, de la même manière.
Puis on calcule la différence en années.

Il y a quelques temps j'avais codé exactement la même fonction, tiens, j'ai retrouvé mon code :
function calculeAgeTextuel(naissance, jourJ, avecAnniversaire, pronom)
{
	var resultat = "";
	var ageJours = 0;
	var ageMois = 0;
	var ageAnnees = 0;
	
	var offsetMois = 0;
	var offsetAnnees = 0;

	// Calcul de la partie "jours" de l’âge
	if (jourJ.getDate() >= naissance.getDate())
		ageJours = jourJ.getDate() - naissance.getDate();
	else
	{
		ageJours = nbJoursDuMois(jourJ.getMonth() - 1) - naissance.getDate() + jourJ.getDate();
		offsetMois = -1;
	}
	
	// Calcul de la partie "mois" de l’âge
	if (jourJ.getMonth() >= naissance.getMonth())
		ageMois = jourJ.getMonth() - naissance.getMonth();
	else
	{
		ageMois = 12 - naissance.getMonth() + jourJ.getMonth();
		offsetAnnees = -1;
	}
	ageMois = ageMois + offsetMois;

	// Calcul de la partie "années" de l’âge
	ageAnnees = jourJ.getYear() - naissance.getYear() + offsetAnnees;

	// réalignement mois
	while (ageMois < 0)
	{
		ageMois = 12 + ageMois;
		ageAnnees = ageAnnees - 1;
	}

	// Écriture du résultat
	var isJours = ageJours != 0;
	var isMois = ageMois != 0;
	var isAnnees = ageAnnees != 0;
	
	var texteJ = "";
	var texteM = "";
	var texteA = "";
	if (isJours && (isMois || isAnnees)) texteJ = "et ";
	if (isJours) texteJ += ageJours + ((ageJours > 1) ? " jours" : " jour");
	if (isAnnees && isMois && !isJours) texteM = "et ";
	if (isMois) texteM += ageMois + " mois";
	if (isAnnees) texteA = ageAnnees + ((ageAnnees > 1) ? " ans" : " an");
	
	resultat = texteA + " " + texteM + " " + texteJ;
	
	if (ageAnnees == 0 && ageMois == 0 && ageJours == 0)
		resultat = "naissance";
	if (naissance > jourJ)
		resultat = "pas né";
	
	if (avecAnniversaire)
	{
		var texteAnniversaire = "";
		if (!isJours && !isMois) texteAnniversaire = "<br/>C'est " + pronom + " anniversaire !";
		else if (!isJours) texteAnniversaire = "<br/> C'est " + pronom + " moiniversaire !";
		resultat += texteAnniversaire;
	}
	return resultat;
}

function nbJoursDuMois(mois)
{
	var resultat = 30;
	if (mois == -1)
		mois = 11;
	if (mois == 0 || mois == 2 || mois == 4 || mois == 6 || mois == 7 || mois == 9 || mois == 11)
		resultat = 31;
	if (mois == 1)
		resultat = 28;
	return resultat;
}
0
moon136 Messages postés 71 Date d'inscription samedi 12 août 2017 Statut Membre Dernière intervention 17 avril 2018
6 oct. 2017 à 12:55
salut tu as la partie html que je test?

Merci
0
Bonjour merci pour ta réponse je comprend mieux à présent. Je vais tester et je te dirais quand ce sera résolu. Je n'ai pas de pc en ce moment
0
moon136 Messages postés 71 Date d'inscription samedi 12 août 2017 Statut Membre Dernière intervention 17 avril 2018
6 oct. 2017 à 13:56
j'ai resolu une partie du bug

en changeant 2 lignes dans la function getAge

age_a = m.getFullYear()-d.getFullYear();
		m.setFullYear(d.getFullYear());


mais quand on rentre la date 10/10/2000 cela affiche 17 ans et pas 16 ans. et je ne voi pas ou est le probleme
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
Modifié le 6 oct. 2017 à 16:36
C'est parce que tu compares sur les années et mois, mais pas sur les jours.
0
moon136 Messages postés 71 Date d'inscription samedi 12 août 2017 Statut Membre Dernière intervention 17 avril 2018
6 oct. 2017 à 20:23
ah ok donc tu sais si je dois ajouter une condition ou une variable ? je nage complétement , merci de ton aide
0