Calculez l'âge en fonction de la date de naissance au format AAAAMMJJ

285

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

Je recherche 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);

Francisc
la source
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.
Marcel Korpel
Je l'ai fait, mais cela ne fonctionne pas sur IE9 Beta, j'ai donc dû le faire à la main.
Francisc
4
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 chose. Les autres réponses donnent des résultats inexacts dans de nombreuses conditions et peuvent être moins simples ou moins efficaces.
Brock Adams,
Merci Brock. J'espérais qu'il y avait une façon plus élégante de faire cela que celle qui semble un peu grossière.
Francisc
4
@Francisc, c'est brut, mais c'est ce que l' Dateobjet devrait faire s'il l'encapsulait. Les gens pouvaient écrire des livres sur la succion de la Datemanipulation de JS . ... Si vous pouvez vivre avec parfois un jour d'arrêt, alors l'approximation: AgeInYears = Math.floor ( (now_Date - DOB_Date) / 31556952000 )est à peu près aussi simple que possible.
Brock Adams

Réponses:

246

J'irais pour 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é: cela pose également des problèmes de précision, de sorte que cela ne peut pas être complètement approuvé non plus. Il peut être désactivé de quelques heures, de certaines années ou pendant l'heure d'été (selon le fuseau horaire).

Au lieu de cela, je recommanderais d'utiliser une bibliothèque pour cela, si la précision est très importante. En outre @Naveens post, c'est probablement le plus précis, car il ne dépend pas de l'heure de la journée.


Repères: http://jsperf.com/birthday-calculation/15

André Snede Kock
la source
3
Cela renvoie 0 ans pour des dates comme 2000-02-29 à 2001-02-28 alors qu'il devrait probablement retourner 1.
RobG
16
@RobG Je ne pense pas qu'une année complète soit techniquement passée du 2000-02-29 au 2001-02-28, rendant votre réponse invalide. Cela n'aurait aucun sens, 2000-02-28 à 2001-02-28 est une année, donc 2000-02-29 à 2001-02-28, doit être inférieure à un an.
André Snede Kock
3
Vous n'avez pas précisé ce que signifie «non précis», j'ai pensé que des informations supplémentaires pourraient être utiles. Vous pourriez envisager de résoudre les problèmes ou de supprimer la réponse.
RobG
1
@RobG En fait, je l'ai fait. J'ai également indiqué une meilleure solution que la mienne. Ma solution résout le problème d'une manière facile à lire, avec des problèmes de précision mineurs, mais dans les limites de son objectif.
André Snede Kock
1
Belle réponse @ AndréSnedeHansen et rapide aussi, puisque vous n'avez pas cette division folle comme c'est présent dans ma réponse ;-) +1 pour la lisibilité et la vitesse.
Kristoffer Dorph
507

Essaye ç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 sur votre code était la substrpartie.

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

naveen
la source
Pouvez-vous donner un exemple d'utilisation? Je ne pouvais pas le faire fonctionner sans modifier la fonction pour prendre 3 arguments distincts, tels que: getAge (y, m, d). Par exemple: jsbin.com/ehaqiw/1/edit
edt
Comme beaucoup d'autres, cela pense que le 2000-02-29 au 2001-02-28 est zéro année, alors qu'il devrait très probablement être 1 (depuis le 2001-03-01 devrait être 1 an 1 jour).
RobG
3
@RobG: lorsque les leaplings `` célèbrent '' (la réponse commune à cette question ne semble en réalité être que `` le week-end le plus proche de la date réelle '') leur jour de naissance diffère en fonction du contexte, y compris: la région géographique (anglais simple: où vous vivez ), LOI (ne sous-estimez pas celle-là), religion et préférences personnelles (y compris comportement de groupe): Une raison: "Je suis né en février", d'autres une raison: "Je suis né le lendemain du 28 février" (qui est le plus souvent le 1er mars) en.wikipedia.org/wiki/Février_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
GitaarLAB
3
@RobG: la fosse de «plus x mois» n'est pas pertinente pour la notion humaine d'âge en années. La notion humaine courante est que le compteur d'âge (en années) augmente chaque jour (sans tenir compte de l'heure) lorsque le calendrier a le même mois # et jour # (par rapport à la date de début): de sorte que 2000-02-28 à 2001-02 -27 = 0 ans et 2000-02-28 à 2001-02-28 = 1 an. L' extension de ce « bon sens » à leaplings: 2000-02-29 (le jour après 2000-02-28) à 2001-02-28 = zéro années . Mon commentaire a simplement déclaré que l'algo répondu donne toujours la réponse humaine «correcte» SI l'on attend / accepte cette logique pour les sauts.
GitaarLAB
3
@RobG: Je n'ai jamais dit que moi ou la réponse était universellement correcte (TM). J'ai inclus la notion de contextes / juridictions / points de vue. Mes deux commentaires incluent clairement un SI majuscule (vers la gestion des sauts d'exception). En fait, mon premier commentaire a dit exactement ce que je voulais dire et n'a jamais inclus de jugement concernant le bien ou le mal. En effet, mes commentaires clarifient quoi et à quoi ne pas s'attendre (et pourquoi) de cette réponse (comme vous l'appelez «mettre en évidence les problèmes»). Ps: 31 février?!?
GitaarLAB
72

Important: Cette réponse ne fournit pas une réponse précise à 100%, elle est éteinte d'environ 10 à 20 heures selon la date.

Il n'y a pas de meilleures solutions (pas dans ces réponses de toute façon). - naveen

Bien sûr, 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 actuellement acceptée. Le point principal de ma solution est que les mathématiques sont rapides, donc au lieu d'utiliser la ramification, et le modèle de date javascript fournit pour calculer une solution, nous utilisons les mathématiques merveilleuses

La réponse ressemble à ceci, et s'exécute ~ 65% plus rapidement que celle de Naveen, plus elle est 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 qui est la longueur d'une année, la longueur d'une année est de 365 jours et 6 heures qui est de 0,25 jour. Au final, je donne le résultat qui nous donne l'âge final.

Voici les repères: http://jsperf.com/birthday-calculation

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

Si vous pouvez trouver une meilleure solution, partagez-la! :-)

Kristoffer Dorph
la source
C'est une solution plutôt cool. Le seul problème que je vois avec lui est l' dateStringargument juste pour le constructeur Date () pour l'analyser correctement. Par exemple, en prenant le YYYYMMDDformat que j'ai donné dans la question, cela échouera.
Francisc
22
Cette réponse contient un bogue. Réglez votre horloge sur 00h01. À 12 h 01, si vous calculez («2012-03-27») (date du jour), vous obtiendrez une réponse de zéro, même si elle doit être égale à 1. Ce bogue existe pour toute l'heure de midi. Cela est dû à la déclaration incorrecte selon laquelle une année contient 365,25 jours. Ce ne est pas. Nous avons affaire à des années civiles, pas à la longueur de l'orbite terrestre (qui est plus précisément 365,256363 jours). Une année compte 365 jours, sauf une année bissextile qui compte 366 jours. En plus de cela, la performance sur quelque chose comme ça n'a pas de sens. La maintenabilité est beaucoup plus importante.
Eric Brandel
1
Merci pour votre solution Kristoffer. Puis-je demander ce que fait le + nouveau par rapport à juste nouveau, et aussi les deux tilde (~) dans le retour?
Frank Jensen
1
@FrankJensen Salut Frank, j'étais aussi curieux et j'ai trouvé cette réponse: le double tilde convertit le flotteur en entier Salutations
Stano
1
@FrankJensen essentiellement le tilde inverse le nombre (la valeur binaire) tout en convertissant float en entier (plancher), par conséquent, deux tilde vous donne le nombre arrondi. Le + devant le nouveau Date () convertit l'objet en représentation entière de l'objet date, cela peut également être utilisé avec des chaînes de nombres par exemple + '21 '=== 21
Kristoffer Dorph
55

Avec momentjs:

/* The difference, in years, between NOW and 2012-05-07 */
moment().diff(moment('20120507', 'YYYYMMDD'), 'years')
Vitor Tyburski
la source
2
@RicardoPontual, cela nécessite des moments, donc ce ne peut pas être la meilleure réponse.
itzmukeshy7
13
@ itzmukeshy7 en effet, pour qu'une réponse soit la meilleure, elle devrait au moins nécessiter jQuery;)
thomaux
@thomaux Cela dépend totalement de l'environnement de développement!
itzmukeshy7
@ itzmukeshy7 relax, c'est une blague;) voir: meta.stackexchange.com/a/19492/173875
thomaux
2
@thomaux Je savais que c'est une blague;)
itzmukeshy7
38

Solution nettoyante à un revêtement avec ES6:

const getAge = birthDate => Math.floor((new Date() - new Date(birthDate).getTime()) / 3.15576e+10)

// today is 2018-06-13
getAge('1994-06-14') // 23
getAge('1994-06-13') // 24

J'utilise une année de 365,25 jours (0,25 en raison des années bissextiles) qui sont respectivement de 3,15576e + 10 millisecondes (365,25 * 24 * 60 * 60 * 1000).

Lucas Janon
la source
1
Assez bien ordonné - pourriez-vous expliquer ce que signifie le 3.15576e + 10?
leonheess
1
Oui, il serait bon d'ajouter la ligne suivante avant la fonction:const yearInMs = 3.15576e+10 // Using a year of 365.25 days (because leap years)
Lucas Janon
12

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 la '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
CMS
la source
Ah oui, j'ai raté l'année bissextile. Je vous remercie.
Francisc
1
Cela donne des valeurs invalides pour certaines combinaisons de dates! Par exemple, si le birthDateest le 5 janvier 1980 et que la date actuelle est le 4 janvier 2005 , la fonction affichera par erreur age25 ... La valeur correcte est 24.
Brock Adams
@BrockAdams Pourquoi est-ce? J'ai ce problème en ce moment. Merci.
Jack H
@VisionIncision, car il ne gère pas correctement les conditions de bord. Croyez-le ou non, le code de la question est la meilleure approche - bien qu'il semble que l'une des réponses ultérieures l'aurait peut-être reconditionné de manière plus appropriée.
Brock Adams
CMS Salut :-) J'ai écrit cette question ( stackoverflow.com/questions/16435981/… ) et on m'a dit que si je veux une réponse 100% précise, je devrais vérifier chaque année - si c'est une année bissextile, puis calculer la dernière fraction. (voir la réponse de Guffa). Votre fonction (en partie) fait cela . mais comment puis-je l'utiliser pour calculer l'âge à 100% avec précision? le DOB commence rarement au 1/1 / aaaa ..... alors comment puis-je utiliser votre fonction pour calculer l'âge exact?
Royi Namir
10

Voici ma solution, passez simplement une date analysable:

function getAge(birth) {
  ageMS = Date.parse(Date()) - Date.parse(birth);
  age = new Date();
  age.setTime(ageMS);
  ageYear = age.getFullYear() - 1970;

  return ageYear;

  // ageMonth = age.getMonth(); // Accurate calculation of the month part of the age
  // ageDay = age.getDate();    // Approximate calculation of the day part of the age
}
Kinergy
la source
7

Solution alternative, car pourquoi pas:

function calculateAgeInYears (date) {
    var now = new Date();
    var current_year = now.getFullYear();
    var year_diff = current_year - date.getFullYear();
    var birthday_this_year = new Date(current_year, date.getMonth(), date.getDate());
    var has_had_birthday_this_year = (now >= birthday_this_year);

    return has_had_birthday_this_year
        ? year_diff
        : year_diff - 1;
}
Josh
la source
5
function age()
{
    var birthdate = $j('#birthDate').val(); // in   "mm/dd/yyyy" format
    var senddate = $j('#expireDate').val(); // in   "mm/dd/yyyy" format
    var x = birthdate.split("/");    
    var y = senddate.split("/");
    var bdays = x[1];
    var bmonths = x[0];
    var byear = x[2];
    //alert(bdays);
    var sdays = y[1];
    var smonths = y[0];
    var syear = y[2];
    //alert(sdays);

    if(sdays < bdays)
    {
        sdays = parseInt(sdays) + 30;
        smonths = parseInt(smonths) - 1;
        //alert(sdays);
        var fdays = sdays - bdays;
        //alert(fdays);
    }
    else{
        var fdays = sdays - bdays;
    }

    if(smonths < bmonths)
    {
        smonths = parseInt(smonths) + 12;
        syear = syear - 1;
        var fmonths = smonths - bmonths;
    }
    else
    {
        var fmonths = smonths - bmonths;
    }

    var fyear = syear - byear;
    document.getElementById('patientAge').value = fyear+' years '+fmonths+' months '+fdays+' days';
}
Sarwar
la source
Merci de trouver facilement l'âge en années mois et jours
Sumit Kumar Gupta
5

Pour tester si l'anniversaire est déjà passé ou non, je définis une fonction d'aide Date.prototype.getDoY, qui renvoie effectivement le numéro de jour de l'année. Le reste est assez explicite.

Date.prototype.getDoY = function() {
    var onejan = new Date(this.getFullYear(), 0, 1);
    return Math.floor(((this - onejan) / 86400000) + 1);
};

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

    var now = new Date(),
        age = now.getFullYear() - birthDate.getFullYear(),
        doyNow = now.getDoY(),
        doyBirth = birthDate.getDoY();

    // normalize day-of-year in leap years
    if (isLeap(now.getFullYear()) && doyNow > 58 && doyBirth > 59)
        doyNow--;

    if (isLeap(birthDate.getFullYear()) && doyNow > 58 && doyBirth > 59)
        doyBirth--;

    if (doyNow <= doyBirth)
        age--;  // birthday not yet passed this year, so -1

    return age;
};

var myBirth = new Date(2001, 6, 4);
console.log(getAge(myBirth));
Marcel Korpel
la source
Cela donne des résultats inexacts en années bissextiles, pour les anniversaires après le 28 février. Il vieillit ces personnes d'un jour. EG: pour DoB = 2001/07/04 , cette fonction retournera 7 ans, le 2008/07/03 .
Brock Adams
@Brock: Merci. Si je ne me trompe pas, j'ai corrigé ce comportement erroné.
Marcel Korpel
Oui, je pense que vous l'avez peut-être fait (pas rigoureusement testé, juste analysé). Mais, notez que la nouvelle solution n'est ni plus simple ni plus élégante que la solution de l'OP (sans compter que celle-ci est correctement encapsulée dans une fonction). ... La solution du PO est plus facile à comprendre (donc à auditer, à tester ou à modifier). Parfois, simple et direct est le meilleur, OMI.
Brock Adams
@Brock: Je suis entièrement d'accord: je dois réfléchir à ce que fait cette fonction et ce n'est jamais une bonne chose.
Marcel Korpel
"If (doyNow <doyBirth)" ne devrait-il pas être "if (doyNow <= doyBirth)"? Dans tous mes tests, la journée a été interrompue par un et cela l'a arrangé.
Ted Kulp
5

Je pense que cela pourrait être simplement comme ça:

function age(dateString){
    let birth = new Date(dateString);
    let now = new Date();
    let beforeBirth = ((() => {birth.setDate(now.getDate());birth.setMonth(now.getMonth()); return birth.getTime()})() < birth.getTime()) ? 0 : 1;
    return now.getFullYear() - birth.getFullYear() - beforeBirth;
}

age('09/20/1981');
//35

Fonctionne également avec un horodatage

age(403501000000)
//34
romuleald
la source
Ce code calculera une personne ayant le même âge toute l'année. Dans votre exemple, si aujourd'hui était '09 / 19/2018 'le code donnerait 37, mais l'âge (la veille de l'anniversaire) serait 36 ​​...
Steve Goossens
4

J'ai juste eu à écrire cette fonction pour moi - la réponse acceptée est assez bonne mais l'OMI pourrait utiliser un peu de nettoyage. Cela prend un horodatage Unix pour dob parce que c'était mon exigence mais pourrait être rapidement adapté pour utiliser une chaîne:

var getAge = function(dob) {
    var measureDays = function(dateObj) {
            return 31*dateObj.getMonth()+dateObj.getDate();
        },
        d = new Date(dob*1000),
        now = new Date();

    return now.getFullYear() - d.getFullYear() - (measureDays(now) < measureDays(d));
}

Notez que j'ai utilisé une valeur plate de 31 dans ma fonction MeasureDays. Tout ce qui compte, c'est que le «jour de l'année» soit une mesure monotone augmentant l'horodatage.

Si vous utilisez un horodatage ou une chaîne javascript, vous souhaiterez évidemment supprimer le facteur 1000.

Keith Nordstrom
la source
n n'est pas défini. Je pense que vous voulez dire maintenant. GetFullYear ()
Larry Battle
4
function getAge(dateString) {

    var dates = dateString.split("-");
    var d = new Date();

    var userday = dates[0];
    var usermonth = dates[1];
    var useryear = dates[2];

    var curday = d.getDate();
    var curmonth = d.getMonth()+1;
    var curyear = d.getFullYear();

    var age = curyear - useryear;

    if((curmonth < usermonth) || ( (curmonth == usermonth) && curday < userday   )){

        age--;

    }

    return age;
}

Pour obtenir l'âge auquel la date européenne est entrée:

getAge('16-03-1989')
Martijn van Hoof
la source
Merci pour votre suggestion sur stackoverflow.com/a/13367162/1055987 bonne capture.
JFK
3

Une autre solution possible avec moment.js :

var moment = require('moment');
var startDate = new Date();
var endDate = new Date();
endDate.setDate(endDate.getFullYear() + 5); // Add 5 years to second date
console.log(moment.duration(endDate - startDate).years()); // This should returns 5
Michael Yurin
la source
2

J'ai vérifié les exemples montrés auparavant et ils n'ont pas fonctionné dans tous les cas, et à cause de cela j'ai créé mon propre script. J'ai testé cela, et cela fonctionne parfaitement.

function getAge(birth) {
   var today = new Date();
   var curr_date = today.getDate();
   var curr_month = today.getMonth() + 1;
   var curr_year = today.getFullYear();

   var pieces = birth.split('/');
   var birth_date = pieces[0];
   var birth_month = pieces[1];
   var birth_year = pieces[2];

   if (curr_month == birth_month && curr_date >= birth_date) return parseInt(curr_year-birth_year);
   if (curr_month == birth_month && curr_date < birth_date) return parseInt(curr_year-birth_year-1);
   if (curr_month > birth_month) return parseInt(curr_year-birth_year);
   if (curr_month < birth_month) return parseInt(curr_year-birth_year-1);
}

var age = getAge('18/01/2011');
alert(age);
paulinho
la source
Le 2000-02-29 au 2001-02-28 devrait-il être d'un an? Si oui, alors ce qui précède n'est pas parfait. :-)
RobG
2

C'est la manière la plus élégante pour moi:

const getAge = (birthDateString) => {
  const today = new Date();
  const birthDate = new Date(birthDateString);

  const yearsDifference = today.getFullYear() - birthDate.getFullYear();

  if (
    today.getMonth() < birthDate.getMonth() ||
    (today.getMonth() === birthDate.getMonth() && today.getDate() < birthDate.getDate())
  ) {
    return yearsDifference - 1;
  }

  return yearsDifference;
};

console.log(getAge('2018-03-12'));

Krzysztof Dąbrowski
la source
1

Obtenez l'âge (années, mois et jours) à partir de la date de naissance avec javascript

Fonction calcularEdad (années, mois et jours)

function calcularEdad(fecha) {
        // Si la fecha es correcta, calculamos la edad

        if (typeof fecha != "string" && fecha && esNumero(fecha.getTime())) {
            fecha = formatDate(fecha, "yyyy-MM-dd");
        }

        var values = fecha.split("-");
        var dia = values[2];
        var mes = values[1];
        var ano = values[0];

        // cogemos los valores actuales
        var fecha_hoy = new Date();
        var ahora_ano = fecha_hoy.getYear();
        var ahora_mes = fecha_hoy.getMonth() + 1;
        var ahora_dia = fecha_hoy.getDate();

        // realizamos el calculo
        var edad = (ahora_ano + 1900) - ano;
        if (ahora_mes < mes) {
            edad--;
        }
        if ((mes == ahora_mes) && (ahora_dia < dia)) {
            edad--;
        }
        if (edad > 1900) {
            edad -= 1900;
        }

        // calculamos los meses
        var meses = 0;

        if (ahora_mes > mes && dia > ahora_dia)
            meses = ahora_mes - mes - 1;
        else if (ahora_mes > mes)
            meses = ahora_mes - mes
        if (ahora_mes < mes && dia < ahora_dia)
            meses = 12 - (mes - ahora_mes);
        else if (ahora_mes < mes)
            meses = 12 - (mes - ahora_mes + 1);
        if (ahora_mes == mes && dia > ahora_dia)
            meses = 11;

        // calculamos los dias
        var dias = 0;
        if (ahora_dia > dia)
            dias = ahora_dia - dia;
        if (ahora_dia < dia) {
            ultimoDiaMes = new Date(ahora_ano, ahora_mes - 1, 0);
            dias = ultimoDiaMes.getDate() - (dia - ahora_dia);
        }

        return edad + " años, " + meses + " meses y " + dias + " días";
    }

Fonction esNumero

function esNumero(strNumber) {
    if (strNumber == null) return false;
    if (strNumber == undefined) return false;
    if (typeof strNumber === "number" && !isNaN(strNumber)) return true;
    if (strNumber == "") return false;
    if (strNumber === "") return false;
    var psInt, psFloat;
    psInt = parseInt(strNumber);
    psFloat = parseFloat(strNumber);
    return !isNaN(strNumber) && !isNaN(psFloat);
}
Angeldev
la source
1

Fonctionne parfaitement pour moi, les gars.

getAge(birthday) {
    const millis = Date.now() - Date.parse(birthday);
    return new Date(millis).getFullYear() - 1970;
}
20 fps
la source
0

Je sais que c'est un fil très ancien mais je voulais mettre dans cette implémentation que j'ai écrite pour trouver l'âge qui je crois est beaucoup plus précis.

var getAge = function(year,month,date){
    var today = new Date();
    var dob = new Date();
    dob.setFullYear(year);
    dob.setMonth(month-1);
    dob.setDate(date);
    var timeDiff = today.valueOf() - dob.valueOf();
    var milliInDay = 24*60*60*1000;
    var noOfDays = timeDiff / milliInDay;
    var daysInYear = 365.242;
    return  ( noOfDays / daysInYear ) ;
}

Bien sûr, vous pouvez l'adapter à d'autres formats d'obtention des paramètres. J'espère que cela aidera quelqu'un à la recherche d'une meilleure solution.

ganaraj
la source
0

J'ai utilisé cette approche en utilisant la logique au lieu des mathématiques. C'est précis et rapide. Les paramètres sont l'année, le mois et le jour de l'anniversaire de la personne. Il renvoie l'âge de la personne sous forme d'entier.

function calculateAge(year, month, day) {
        var currentDate = new Date();
        var currentYear = currentDate.getFullYear();
        var currentMonth = currentDate.getUTCMonth() + 1;
        var currentDay = currentDate.getUTCDate();
        // You need to treat the cases where the year, month or day hasn't arrived yet.
        var age = currentYear - year;
        if (currentMonth > month) {
            return age;
        } else {
            if (currentDay >= day) {
                return age;
            } else {
                age--;
                return age;
            }
        }
    }
Pedro Alvares
la source
chaînes ou objets de date pour entrée selon OP
nazim
0

En adoptant les publications de Naveen et de l'OP d'origine, je me suis retrouvé avec un stub de méthode réutilisable qui accepte à la fois des chaînes et / ou des objets JS Date.

Je l'ai nommé gregorianAge()parce que ce calcul donne exactement comment nous dénotons l'âge en utilisant le calendrier grégorien. c'est-à-dire sans compter l'année de fin si le mois et le jour précèdent le mois et le jour de l'année de naissance.

/**
 * Calculates human age in years given a birth day. Optionally ageAtDate
 * can be provided to calculate age at a specific date
 *
 * @param string|Date Object birthDate
 * @param string|Date Object ageAtDate optional
 * @returns integer Age between birthday and a given date or today
 */
function gregorianAge(birthDate, ageAtDate) {
  // convert birthDate to date object if already not
  if (Object.prototype.toString.call(birthDate) !== '[object Date]')
    birthDate = new Date(birthDate);

  // use today's date if ageAtDate is not provided
  if (typeof ageAtDate == "undefined")
    ageAtDate = new Date();

  // convert ageAtDate to date object if already not
  else if (Object.prototype.toString.call(ageAtDate) !== '[object Date]')
    ageAtDate = new Date(ageAtDate);

  // if conversion to date object fails return null
  if (ageAtDate == null || birthDate == null)
    return null;


  var _m = ageAtDate.getMonth() - birthDate.getMonth();

  // answer: ageAt year minus birth year less one (1) if month and day of
  // ageAt year is before month and day of birth year
  return (ageAtDate.getFullYear()) - birthDate.getFullYear() 
  - ((_m < 0 || (_m === 0 && ageAtDate.getDate() < birthDate.getDate())) ? 1 : 0)
}

// Below is for the attached snippet

function showAge() {
  $('#age').text(gregorianAge($('#dob').val()))
}

$(function() {
  $(".datepicker").datepicker();
  showAge();
});
<link rel="stylesheet" href="//code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
<script src="//code.jquery.com/jquery-1.10.2.js"></script>
<script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script>

DOB:
<input name="dob" value="12/31/1970" id="dob" class="datepicker" onChange="showAge()" /> AGE: <span id="age"><span>

nazim
la source
0

Deux autres options:

// Int Age to Date as string YYY-mm-dd
function age_to_date(age)
{
    try {
        var d = new Date();
        var new_d = '';
        d.setFullYear(d.getFullYear() - Math.abs(age));
        new_d = d.getFullYear() + '-' + d.getMonth() + '-' + d.getDate();

        return new_d;
    } catch(err) {
        console.log(err.message);
    }
}
// Date string (YYY-mm-dd) to Int age (years old)
function date_to_age(date)
{
    try {
        var today = new Date();
        var d = new Date(date);

        var year = today.getFullYear() - d.getFullYear();
        var month = today.getMonth() - d.getMonth();
        var day = today.getDate() - d.getDate();
        var carry = 0;

        if (year < 0)
            return 0;
        if (month <= 0 && day <= 0)
            carry -= 1;

        var age = parseInt(year);
        age += carry;

        return Math.abs(age);
    } catch(err) {
        console.log(err.message);
    }
}
rsnoopy
la source
0

J'ai fait une mise à jour d'une réponse précédente.

var calculateAge = function(dob) {
    var days = function(date) {
            return 31*date.getMonth() + date.getDate();
        },
        d = new Date(dob*1000),
        now = new Date();

    return now.getFullYear() - d.getFullYear() - ( measureDays(now) < measureDays(d));
}

J'espère que ça aide: D

Fabricio
la source
0

voici un moyen simple de calculer l'âge:

//dob date dd/mm/yy 
var d = 01/01/1990


//today
//date today string format 
var today = new Date(); // i.e wed 04 may 2016 15:12:09 GMT
//todays year
var todayYear = today.getFullYear();
// today month
var todayMonth = today.getMonth();
//today date
var todayDate = today.getDate();

//dob
//dob parsed as date format   
var dob = new Date(d);
// dob year
var dobYear = dob.getFullYear();
// dob month
var dobMonth = dob.getMonth();
//dob date
var dobDate = dob.getDate();

var yearsDiff = todayYear - dobYear ;
var age;

if ( todayMonth < dobMonth ) 
 { 
  age = yearsDiff - 1; 
 }
else if ( todayMonth > dobMonth ) 
 {
  age = yearsDiff ; 
 }

else //if today month = dob month
 { if ( todayDate < dobDate ) 
  {
   age = yearsDiff - 1;
  }
    else 
    {
     age = yearsDiff;
    }
 }
SSS
la source
0
var now = DateTime.Now;
var age = DateTime.Now.Year - dob.Year;
if (now.Month < dob.Month || now.Month == dob.Month && now.Day < dob.Day) age--;
DBoi
la source
Il fait une simple différence d'année entre maintenant et l'année de naissance. Ensuite, il soustrait une année si aujourd'hui est plus tôt dans l'année que l'anniversaire (pensez-y, votre âge augmente pendant l'année, le jour de votre anniversaire)
Steve Goossens
0

Vous pouvez l'utiliser pour la restriction d'âge dans votre formulaire -

function dobvalidator(birthDateString){
    strs = birthDateString.split("-");
    var dd = strs[0];
    var mm = strs[1];
    var yy = strs[2];

    var d = new Date();
    var ds = d.getDate();
    var ms = d.getMonth();
    var ys = d.getFullYear();
    var accepted_age = 18;

    var days = ((accepted_age * 12) * 30) + (ms * 30) + ds;
    var age = (((ys - yy) * 12) * 30) + ((12 - mm) * 30) + parseInt(30 - dd);

    if((days - age) <= '0'){
        console.log((days - age));
        alert('You are at-least ' + accepted_age);
    }else{
        console.log((days - age));
        alert('You are not at-least ' + accepted_age);
    }
}
IshaniNet
la source
0

Je suis un peu trop tard mais j'ai trouvé que c'était le moyen le plus simple de calculer une date de naissance.

$(document).ready(init);

function init()
{
  writeYears("myage", 0, Age());
  $(".captcha").click(function()
  {
    reloadCaptcha();
  });

}

function Age()
{
    var birthday = new Date(1997, 02, 01),  //Year, month, day.
        today = new Date(),
        one_year = 1000*60*60*24*365;
    return Math.floor( (today.getTime() - birthday.getTime() ) / one_year);
}

function writeYears(id, current, maximum)
{
  document.getElementById(id).innerHTML = current;

  if (current < maximum)
  {
    setTimeout( function() { writeYears(id, ++current, maximum); }, Math.sin( current/maximum ) * 200 );
    }
}

La balise HTML:

<span id="myage"></span>

J'espère que cela vous aidera.

TWDbag
la source
-1

Voici la solution la plus simple et la plus précise que j'ai pu trouver:

Date.prototype.getAge = function (date) {
    if (!date) date = new Date();
    return ~~((date.getFullYear() + date.getMonth() / 100
    + date.getDate() / 10000) - (this.getFullYear() + 
    this.getMonth() / 100 + this.getDate() / 10000));
}

Et voici un échantillon qui tiendra compte du 29 février au 28 février de chaque année.

Date.prototype.getAge = function (date) {
    if (!date) date = new Date();
    var feb = (date.getMonth() == 1 || this.getMonth() == 1);
    return ~~((date.getFullYear() + date.getMonth() / 100 + 
        (feb && date.getDate() == 29 ? 28 : date.getDate())
        / 10000) - (this.getFullYear() + this.getMonth() / 100 + 
        (feb && this.getDate() == 29 ? 28 : this.getDate()) 
        / 10000));
}

Cela fonctionne même avec un âge négatif!

wizulus
la source
Comme tous les autres, il pense que 2000-02-29 à 2001-02-28 est zéro année.
RobG
J'ai mis à jour ma réponse pour tenir compte du cas de pointe de l'année bissextile. Merci @RobG
wizulus
-1

Encore une autre solution:

/**
 * Calculate age by birth date.
 *
 * @param int birthYear Year as YYYY.
 * @param int birthMonth Month as number from 1 to 12.
 * @param int birthDay Day as number from 1 to 31.
 * @return int
 */
function getAge(birthYear, birthMonth, birthDay) {
  var today = new Date();
  var birthDate = new Date(birthYear, birthMonth-1, birthDay);
  var age = today.getFullYear() - birthDate.getFullYear();
  var m = today.getMonth() - birthDate.getMonth();
  if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {
    age--;
  }
  return age;
}
xexsus
la source
-1

Avec la méthode momentjs "fromNow", cela vous permet de travailler avec une date formatée, c'est-à-dire: 15/03/1968

var dob = document.getElementByID("dob"); var age = moment(dob.value).fromNow(true).replace(" years", "");

//fromNow(true) => suffix "ago" is not displayed //but we still have to get rid of "years";

En version prototype

String.prototype.getAge = function() {
return moment(this.valueOf()).fromNow(true).replace(" years", "");

}

Nicolas Giszpenc
la source