28
février
2011
Algorithme de calcul de l’age
février
2011
Un article de morgoth_fr
7 Commentaires
Aujourd’hui, petit problème d’algorithmique simple. Comment calculer en Java l’age d’une personne à ce jour en connaissant sa date de naissance.
Une recherche sur Google ne donne pas de réponse simple. J’espère que celle-ci le sera.
/**
* Compute age of someone. Assume birthday is before today.
* @param birthday Date of birth.
* @param today The date at which you want to calculate age.
* @return age
*/
public int computeAge(Date birthday, Date today) {
Calendar cBirthday = new GregorianCalendar();
Calendar cToday = new GregorianCalendar();
cBirthday.setTime(birthday);
cToday.setTime(today);
int yearDiff = cToday.get(Calendar.YEAR) - cBirthday.get(Calendar.YEAR);
cBirthday.set(Calendar.YEAR, cToday.get(Calendar.YEAR));
if (!cBirthday.after(cToday)) {
return yearDiff; //Birthday already celebrated this year
}
else {
return Math.max(0, yearDiff-1); //Need a max to avoid -1 for baby
}
}
* Compute age of someone. Assume birthday is before today.
* @param birthday Date of birth.
* @param today The date at which you want to calculate age.
* @return age
*/
public int computeAge(Date birthday, Date today) {
Calendar cBirthday = new GregorianCalendar();
Calendar cToday = new GregorianCalendar();
cBirthday.setTime(birthday);
cToday.setTime(today);
int yearDiff = cToday.get(Calendar.YEAR) - cBirthday.get(Calendar.YEAR);
cBirthday.set(Calendar.YEAR, cToday.get(Calendar.YEAR));
if (!cBirthday.after(cToday)) {
return yearDiff; //Birthday already celebrated this year
}
else {
return Math.max(0, yearDiff-1); //Need a max to avoid -1 for baby
}
}
Si vous avez plus simple, plus lisible ou si j’ai fait une erreur, merci de compléter.
C’est un peu limite car il faudrait prendre en compte l’heure exacte de naissance. J’ai cherché sur le net mais je n’ai pas trouvé d’information précise (par ex juridique) sur la manière de calculer l’age.
Mais intuitivement je dirais que tu as raison, on considère qu’on est agé de 18 ans le jour du 18e anniversaire de sa naissance.
Je vais donc modifier l’algo.
A la place de :
if (cBirthday.before(cToday)) {
j’aurai plutot mis :
if (!cBirthday.after(cToday)) {
En effet, si je veux tester la majorité d’une personne, la méthode actuelle ne marche pas dans le cas où la date du jour est 18 ans jour pour jour après la date de naissance :
computeAge(15/01/1993, 15/01/2011) = 17. Cela devrait me retourner 18.
Autant pour moi,
» cBirthday.set(Calendar.YEAR, cToday.get(Calendar.YEAR)); «
J’avais pas fait attention à cette instruction !
@Hikage : Je connaissais pas JodaTime. Ca semble être vraiment une bonne chose, car les manipulations de dates sont très fréquentes dans certaines applications.
@bassim : Regarde bien l’algo, je soustrais les années, mais ensuite il y a un petit test pour vérifier si l’anniversaire est déjà passé.
@lunatix : La licence ? On va dire que c’est une donation au domaine public
tu as la license de ce code sous le coude ? je l’ajouterais bien a mon petit DSL qui me permet de gérer les dates
http://code.google.com/p/datedsl/source/browse/trunk/dateDsl/src/com/unimondes/dsl/DateDsl.java
avec j’arrive faire des trucs genre
range()
.startWith(now()).endWith(tomorrow())
.isDistinctFrom(
range().startWith(yesterday()).endWith(now()
)
)
pour gerer les calculs de dates.
Salut,
Une remarque par rapport au premier algorithme,
si quelqu’un est né le 15 juillet 1985, il devrait en ce jour (10 juillet 2008) avoir 22 ans normalement.
Si on soustrait que les années, ça donnera 23 ans , non ?
Si tu veux t’amuser avec JodaTime, le framework à la base de la nouvelle API de temps Java 7, cela donne ceci :
public int computeAge(DateTime birthDay, DateTime currentDate) {
if(birthDay.isBefore(currentDate)){
Period period = new Period(birthDay, currentDate);
return period.getYears();
} else {
return 0;
}
}
public int computeAge(Date birthDay, Date currentDate ){
return computeAge(new DateTime(birthDay), new DateTime(currentDate));
}