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
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.
0 votes
Merci Brock. J'espérais qu'il y avait une façon plus élégante de le faire que celle qui semble un peu grossière.
4 votes
@Francisc, c'est grossier, mais c'est ce que la
Date
que l'objet aurait à faire s'il l'encapsulait. Les gens pourraient écrire des livres sur la nullité de JS.Date
la manipulation. ... Si vous pouvez vous accommoder d'un décalage d'un jour, alors l'approximation.. :AgeInYears = Math.floor ( (now_Date - DOB_Date) / 31556952000 )
est à peu près aussi simple que vous pouvez le faire.0 votes
Je ne peux pas vivre avec ça. Haha. Vous devriez faire une réponse à votre commentaire initial car il semble que celui qui est actuellement correct n'est pas précis à 100% et pourrait conduire à de mauvaises implémentations des lecteurs.
0 votes
ici un bon test de performance pour les possibilités mentionnées ci-dessous : jsben.ch/#/Xsg3o