Calcola l’età data la data di nascita nel formato AAAAMMGG

Come posso calcolare un’età in anni, data la data di nascita del formato AAAAMMGG? È ansible utilizzare la funzione Date() ?

Sto cercando una soluzione migliore di quella che sto usando ora:

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

Vorrei andare per la leggibilità:

 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); } 

Dichiarazione di non responsabilità: anche questo ha problemi di precisione, quindi anche questo non può essere completamente considerato attendibile. Può essere spento di alcune ore, in alcuni anni o durante l’ora legale (a seconda del fuso orario).

Invece consiglierei di usare una libreria per questo, se la precisione è molto importante. Anche il @Naveens post , è probabilmente il più preciso, in quanto non dipende dall’ora del giorno.


Benchmark: http://jsperf.com/birthday-calculation/15

Prova questo.

 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; } 

Credo che l'unica cosa che è sembrata grezza nel tuo codice sia stata la parte substr .

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

Importante: questa risposta non fornisce una risposta precisa al 100%, è spenta di circa 10-20 ore a seconda della data.

Non ci sono soluzioni migliori (non in queste risposte comunque). – Naveen

Ovviamente non ho resistito all’impulso di raccogliere la sfida e fare un calcolo del compleanno più veloce e più breve dell’attuale soluzione accettata. Il punto principale per la mia soluzione è che la matematica è veloce, quindi invece di usare la ramificazione, e il modello di data javascript fornisce per calcolare una soluzione, usiamo la matematica meravigliosa

La risposta è simile a questa e viene eseguita circa il 65% più velocemente rispetto a quella di Naveen ed è molto più breve:

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

Il numero magico: 31557600000 è 24 * 3600 * 365,25 * 1000 Qual è la durata di un anno, la durata di un anno è di 365 giorni e di 6 ore che è di 0,25 giorni. Alla fine i piano il risultato che ci dà l’età finale.

Ecco i benchmark: http://jsperf.com/birthday-calculation

Per supportare il formato dati OP è ansible sostituire +new Date(dateString);
con +new Date(d.substr(0, 4), d.substr(4, 2)-1, d.substr(6, 2));

Se riesci a trovare una soluzione migliore, condividi! 🙂

Con momentjs:

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

Qualche tempo fa ho creato una funzione con questo scopo:

 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; } 

Richiede un object Date come input, quindi è necessario analizzare la stringa di data formattata 'YYYYMMDD' :

 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 

Ecco la mia soluzione, basta passare una data analizzabile:

 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 } 

Per verificare se il compleanno è già passato o meno, definisco una funzione di supporto Date.prototype.getDoY , che restituisce effettivamente il numero del giorno dell’anno. Il resto è abbastanza auto-esplicativo.

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

Soluzione alternativa, perché perché no:

 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; } 

Ho appena dovuto scrivere questa funzione per me stesso – la risposta accettata è abbastanza buona ma IMO potrebbe usare un po ‘di pulizia. Questo richiede un timestamp unix per dob perché era il mio requisito ma potrebbe essere rapidamente adattato per utilizzare una stringa:

 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)); } 

Si noti che ho utilizzato un valore flat di 31 nella mia funzione measureDays. Tutto ciò che importa è che il "giorno dell'anno" sia una misura monotonicamente crescente del timestamp.

Se si utilizza un timestamp o una stringa javascript, ovviamente si vorrà rimuovere il fattore 1000.

 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; } 

Per ottenere l'età in cui è stata inserita la data europea:

 getAge('16-03-1989') 

Penso che potrebbe essere semplicemente così:

 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 

Funziona anche con un timestamp

 age(403501000000) //34 
 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'; } 

Un’altra soluzione ansible con 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 

Ho controllato gli esempi mostrati in precedenza e non hanno funzionato in tutti i casi, e per questo ho creato una mia sceneggiatura. Ho provato questo, e funziona perfettamente.

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

Ottieni l’età (anni, mesi e giorni) dalla data di nascita con javascript

Funzione CalcularEdad (anni, mesi e giorni)

 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"; } 

Funzione 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); } 

Ho usato questo approccio usando la logica invece della matematica. È preciso e veloce. I parametri sono l’anno, il mese e il giorno del compleanno della persona. Restituisce l’età della persona come numero intero.

 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; } } } 

Adottando i post di naveen e di OP originali, ho finito con uno stub di metodo riutilizzabile che accetta sia stringhe e / o oggetti Date JS.

L’ho chiamato gregorianAge() perché questo calcolo dà esattamente come indichiamo l’età usando il calendario gregoriano. cioè senza contare l’anno di fine se mese e giorno è prima del mese e del giorno dell’anno di nascita.

 /** * 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(); }); 
    DOB:  AGE:  

Altre due opzioni:

 // 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); } } 

Ho fatto qualche aggiornamento a una risposta precedente.

 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)); } 

Spero che questo aiuti: D

ecco un modo semplice per calcolare l’età:

 //dob date dd/mm/yy var d = 01/01/1990 //today //date today string format var today = new Date(); // ie 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; } } 
 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--; 

Pulire la soluzione one-liner ES6 scritta:

 const getAge = birthDate => Math.floor((new Date() - new Date(birthDate).getTime()) / 31556925994) // (today is 2018-06-13) getAge('1994-06-14') // 23 getAge('1994-06-13') // 24 

Usando un anno di 365.242199 giorni (perché gli anni bisestili)

Funziona perfettamente per me, ragazzi.

 getAge(birthday) { const millis = Date.now() - Date.parse(birthday); return new Date(millis).getFullYear() - 1970; } 

Puoi usare questo per limiti di età nella tua forma –

 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); } } 

So che questo è un thread molto vecchio, ma ho voluto inserire questa implementazione che ho scritto per trovare l’età che ritengo sia molto più accurata.

 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 ) ; } 

Ovviamente puoi adattarlo per adattarlo ad altri formati di ottenere i parametri. Spero che questo aiuti qualcuno a cercare una soluzione migliore.

Ecco la soluzione più semplice e precisa che potrei fornire:

 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)); } 

Ed ecco un esempio che prenderà in considerazione il 29 febbraio -> 28 febbraio di un anno.

 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)); } 

Funziona anche con l’età negativa!

Ancora un’altra soluzione:

 /** * 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; } 

Con il metodo momentjs “fromNow”, questo ti consente di lavorare con data formattata, ovvero: 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";

Come una versione prototipo

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

}

  function clearInfo(date) { date.setFullYear(0); date.setHours(0); date.setMinutes(0); date.setSeconds(0); date.setMilliseconds(0); return date; } function compareDateOnly(date1, date2) { date1 = clearInfo(new Date(date1)); date2 = clearInfo(new Date(date2)); return date1 - date2; } function getAge(date) { var bday = new Date(date); var now = new Date(); var years = now.getFullYear() - bday.getFullYear(); if (compareDateOnly(bday, now) < 0) { //this year birthday past return years; } return years - 1; //not past } 

Supponendo che una persona sia nata l'11 settembre 1991, non avrebbe compiuto 1 anno fino al 12 settembre 1992.

Ho una bella risposta anche se non è il mio codice. Purtroppo ho dimenticato il post originale.

 function calculateAge(y, m, d) { var _birth = parseInt("" + y + affixZero(m) + affixZero(d)); var today = new Date(); var _today = parseInt("" + today.getFullYear() + affixZero(today.getMonth() + 1) + affixZero(today.getDate())); return parseInt((_today - _birth) / 10000); } function affixZero(int) { if (int < 10) int = "0" + int; return "" + int; } var age = calculateAge(1980, 4, 22); alert(age);