332 votes

Calculer l'âge à partir de la date de naissance au format AAAAMMJJ.

Comment calculer un âge en années, à partir d'une date de naissance au format AAAAMMJJ ? Est-il possible d'utiliser la fonction Date() fonction ?

Je suis à la recherche d'une meilleure solution que celle que j'utilise actuellement :

var dob = '19800810';
var year = Number(dob.substr(0, 4));
var month = Number(dob.substr(4, 2)) - 1;
var day = Number(dob.substr(6, 2));
var today = new Date();
var age = today.getFullYear() - year;
if (today.getMonth() < month || (today.getMonth() == month && today.getDate() < day)) {
  age--;
}
alert(age);

0 votes

Faites attention à votre formatage, ne le faites pas comme vous l'avez fait ; indentez simplement votre code avec 4 espaces en utilisant le bouton code (010101) ou Ctrl-K.

0 votes

Je l'ai fait mais cela ne fonctionne pas sur IE9 Beta donc j'ai dû le faire à la main.

4 votes

Votre solution originale est meilleure, pour calculer l'âge, que les réponses actuelles. La réponse de Júlio Santos est essentiellement la même. Les autres réponses donnent des résultats inexacts dans de nombreuses conditions, et peuvent être moins directes ou moins efficaces.

575voto

naveen Points 21236

Essayez ça.

function getAge(dateString) {
    var today = new Date();
    var birthDate = new Date(dateString);
    var age = today.getFullYear() - birthDate.getFullYear();
    var m = today.getMonth() - birthDate.getMonth();
    if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {
        age--;
    }
    return age;
}

Je crois que la seule chose qui semblait grossière dans votre code était le substr partie.

Violon : http://jsfiddle.net/codeandcloud/n33RJ/

0 votes

Pouvez-vous donner un exemple d'utilisation ? Je n'ai pas réussi à le faire fonctionner sans modifier la fonction pour qu'elle prenne 3 arguments distincts, comme : getAge(y,m,d). Par exemple : jsbin.com/ehaqiw/1/edit

0 votes

Comme beaucoup d'autres, il pense que 2000-02-29 à 2001-02-28 est une année nulle, alors qu'elle devrait être égale à 1 (puisque 2001-03-01 devrait être une année et un jour).

4 votes

@RobG : quand les bissextiles "célèbrent" (la réponse courante à cette question ne semble être que : "le week-end le plus proche de la date réelle") leur jour de naissance. diffère en fonction du contexte, notamment : la région géographique (en anglais simple : l'endroit où vous vivez), le DROIT (ne le sous-estimez pas), la religion et la préférence personnelle (y compris le comportement de groupe) : Certaines raisons : "Je suis né en février", d'autres : "Je suis né le jour suivant le 28 février" (qui est le plus souvent le 1er mars). fr.wikipedia.org/wiki/February_29 Pour tout ce qui précède, cet algo est correct SI le 1er mars est le résultat de l'année bissextile dont on a besoin.

291voto

André Snede Hansen Points 1922

Je privilégierais la lisibilité :

function _calculateAge(birthday) { // birthday is a date
    var ageDifMs = Date.now() - birthday.getTime();
    var ageDate = new Date(ageDifMs); // miliseconds from epoch
    return Math.abs(ageDate.getUTCFullYear() - 1970);
}

Avis de non-responsabilité : Il y a aussi des problèmes de précision, donc on ne peut pas non plus lui faire entièrement confiance. Elle peut être décalée de quelques heures, certaines années, ou pendant l'heure d'été (selon le fuseau horaire).

Je vous recommande plutôt d'utiliser une bibliothèque pour cela, si la précision est très importante. Voir aussi @Naveens post est probablement le plus précis, car il ne dépend pas de l'heure de la journée.


3 votes

Cela renvoie 0 année pour des dates comme 2000-02-29 à 2001-02-28 alors que cela devrait probablement renvoyer 1.

0 votes

J'ai également commenté la réponse de Naveen. Elle fait la même chose, ainsi que toutes les autres réponses que j'ai essayées - sauf la mienne, bien sûr :-)

17 votes

@RobG Je ne pense pas qu'une année complète se soit techniquement écoulée entre 2000-02-29 et 2001-02-28, ce qui rend votre réponse invalide. Cela n'aurait pas de sens, 2000-02-28 à 2001-02-28 est une année, donc 2000-02-29 à 2001-02-28, doit être moins d'une année.

73voto

Kristoffer Dorph Points 529

Important : cette réponse n'est pas précise à 100%, elle est décalée de 10 à 20 heures en fonction de la date.

Il n'y a pas de meilleures solutions (pas dans ces réponses en tout cas). - naveen

Bien entendu, je n'ai pas pu résister à l'envie de relever le défi et de créer une calculatrice d'anniversaire plus rapide et plus courte que la solution actuelle. Le point principal de ma solution, c'est que les mathématiques sont rapides, donc au lieu d'utiliser les branchements et le modèle de date fourni par javascript pour calculer une solution, nous utilisons les merveilleuses mathématiques suivantes

La réponse ressemble à ceci, et s'exécute ~65% plus vite que celle de naveen, en plus d'être beaucoup plus courte :

function calcAge(dateString) {
  var birthday = +new Date(dateString);
  return ~~((Date.now() - birthday) / (31557600000));
}

Le nombre magique : 31557600000 est 24 * 3600 * 365.25 * 1000 Ce qui est la durée d'une année, la durée d'une année est de 365 jours et 6 heures, soit 0,25 jour. A la fin, j'ai mis au sol le résultat qui nous donne l'âge final.

Voici les points de repère : http://jsperf.com/birthday-calculation

Pour supporter le format de données d'OP, vous pouvez remplacer +new Date(dateString);
avec +new Date(d.substr(0, 4), d.substr(4, 2)-1, d.substr(6, 2));

Si vous trouvez une meilleure solution, merci de la partager ! :-)

0 votes

C'est une solution plutôt cool. Le seul problème que je vois avec elle est le dateString doit être suffisant pour que le constructeur de Date() l'analyse correctement. Par exemple, en prenant l'argument YYYYMMDD format que j'ai donné dans la question, il échouera.

0 votes

C'est vrai, je viens d'ajouter un commentaire à ce sujet :-)

25 votes

Cette réponse contient un bug. Réglez votre horloge à 12h01. À 12 h 01, si vous calcAge('2012-03-27') (la date d'aujourd'hui), vous obtiendrez une réponse égale à zéro, alors qu'elle devrait être égale à 1. Ce bogue existe pour toute l'heure de 0 h 00. Il est dû à l'affirmation incorrecte selon laquelle une année compte 365,25 jours. Ce n'est pas le cas. Il s'agit d'années civiles, et non de la longueur de l'orbite de la Terre (qui est plus précisément de 365,256363 jours). Une année compte 365 jours, sauf une année bissextile qui compte 366 jours. En outre, les performances d'un tel système n'ont aucune importance. La maintenabilité est bien plus importante.

64voto

Vitor Tyburski Points 354

Avec momentjs :

/* The difference, in years, between NOW and 2012-05-07 */
moment().diff(moment('20120507', 'YYYYMMDD'), 'years')

2 votes

@RicardoPontual cela nécessite momentjs, donc ne peut pas être la meilleure réponse.

19 votes

@itzmukeshy7 en effet, pour qu'une réponse soit la meilleure, elle devrait au moins nécessiter jQuery ;)

0 votes

@thomaux Cela dépend totalement de l'environnement de développement !

13voto

CMS Points 315406

Il y a quelque temps, j'ai créé une fonction dans ce but :

function getAge(birthDate) {
  var now = new Date();

  function isLeap(year) {
    return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
  }

  // days since the birthdate    
  var days = Math.floor((now.getTime() - birthDate.getTime())/1000/60/60/24);
  var age = 0;
  // iterate the years
  for (var y = birthDate.getFullYear(); y <= now.getFullYear(); y++){
    var daysInYear = isLeap(y) ? 366 : 365;
    if (days >= daysInYear){
      days -= daysInYear;
      age++;
      // increment the age only if there are available enough days for the year.
    }
  }
  return age;
}

Il prend un objet Date en entrée, vous devez donc analyser le code de l'objet 'YYYYMMDD' chaîne de date formatée :

var birthDateStr = '19840831',
    parts = birthDateStr.match(/(\d{4})(\d{2})(\d{2})/),
    dateObj = new Date(parts[1], parts[2]-1, parts[3]); // months 0-based!

getAge(dateObj); // 26

0 votes

Ah oui, j'ai raté l'année bissextile. Merci.

1 votes

Cela donne des valeurs invalides pour certaines combinaisons de dates ! Par exemple, si le birthDate est 5 janvier 1980 et la date du jour est 4 janvier 2005 alors la fonction rapportera de manière erronée age comme 25... La valeur correcte étant 24.

0 votes

@BrockAdams Pourquoi ? Je rencontre ce problème en ce moment. Merci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X