以YYYYMMDD格式计算出生date的年龄

考虑到格式为YYYYMMDD的出生date,我怎样才能计算年龄? 是否有可能使用Date()函数?

我正在寻找比我现在使用的解决scheme更好的解决scheme:

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

我会去可读性:

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

免责声明:这也有精确的问题,所以这也不能完全信任。 它可以closures几个小时,几年或夏令时(取决于时区)。

相反,我会build议使用这个库,如果精度是非常重要的。 另外@Naveens post ,可能是最准确的,因为它不依赖于一天的时间。


基准: http : //jsperf.com/birthday-calculation/15

尝试这个。

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

我相信你的代码中唯一看起来粗糙的是substr部分。

小提琴 : http : //jsfiddle.net/codeandcloud/n33RJ/

重要提示:这个答案没有提供100%准确的答案,根据date不同,大概10-20个小时。

没有更好的解决scheme(不是在这些答案中)。 – 纳文

我当然忍不住要接受这个挑战,并且要比现在接受的解决scheme更快,更短的生日计算器。 我的解决scheme的主要观点是,math是快速的,所以而不是使用分支,和date模型的JavaScript提供了一个解决scheme,我们使用精彩的math

答案看起来像这样,运行速度比naveen快65%,而且要短得多:

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

幻数:31557600000是24 * 3600 * 365.25 * 1000这是一年的长度,一年的时间是365天,6个小时是0.25天。 最后,我把结果告诉了我们最后的年龄。

这是基准: http : //jsperf.com/birthday-calculation

为了支持OP的数据格式,你可以replace+new Date(dateString);
+new Date(d.substr(0, 4), d.substr(4, 2)-1, d.substr(6, 2));

如果你能想出更好的解决scheme,请分享! 🙂

随着时间的推移:

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

前一段时间,我为此做了一个function:

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

它需要一个Date对象作为input,所以你需要parsing'YYYYMMDD'格式的datestring:

 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 

这是我的解决scheme,只是传递一个可parsing的date:

 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 } 

为了testing生日是否已经过去,我定义了一个辅助函数Date.prototype.getDoY ,它有效地返回了年份的date编号。 其余的是不言自明的。

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

我只需要为自己编写这个函数 – 接受的答案是相当不错的,但IMO可以使用一些清理。 这需要一个Unix的时间戳,因为这是我的要求,但可以很快适应使用一个string:

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

注意我在我的measureDays函数中使用了31的平坦值。 所有计算值得关注的是,“日年”是时间戳的单调递增量度。

如果使用JavaScript时间戳或string,显然你会想要删除因子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; } 

为了获得欧洲date进入的年龄:

 getAge('16-03-1989') 
 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'; } 

替代解决scheme,因为为什么不:

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

我想这可能就是这样的:

 function age(dateString){ return new Date().getFullYear() - new Date(dateString).getFullYear() } age('09/20/1981'); //35 

也有一个时间戳

 age(403501000000) //34 

我已经检查过之前显示的例子,他们没有在所有情况下工作,因此我做了我自己的脚本。 我testing了这个,它完美的工作。

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

从javascript出生的date获取年龄(年,月,日)

函数calcularEdad(年,月,日)

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

functionesNumero

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

我使用这种方法使用逻辑,而不是math。 这是准确和快速的。 参数是人的生日的年月日。 它将整个人的年龄作为一个整数返回。

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

从naveen和原来的OP的post采用我结束了一个可重用的方法存根,接受string和/或JSdate对象。

我将它命名为gregorianAge()因为此计算给出了我们如何使用公历来表示年龄。 即如果月和日在出生年份的月份和date之前,则不计算结束年份。

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

还有两个选项:

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

我已经做了一些更新到以前的答案。

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

我希望这有助于:D

这里是一个简单的计算年龄的方法:

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

使用moment.js的另一个可能的解决scheme:

 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 

我知道这是一个非常古老的线程,但是我想把这个实现写进去,以便find我认为更准确的年代。

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

当然,你可以适应其他格式的参数。 希望这有助于寻找更好的解决scheme的人。

这是我能想到的最简单,最准确的解决scheme:

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

这里是一个样本,将考虑2月29日 – > 2月28日一年。

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

它甚至适用于消极的年龄!

又一个解决scheme:

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

使用“从现在”的方法,这允许您使用格式化的date,即:03/15/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";

作为原型版本

 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 } 

假设一个人1991年9月11日出生,他将不会在1992年9月12日才1岁。

我有一个漂亮的答案,虽然这不是我的代码。 不幸的是我忘了原来的post。

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

看到这个例子,你从这里得到全年的一天的信息

 function getAge(dateString) { var today = new Date(); var birthDate = new Date(dateString); var age = today.getFullYear() - birthDate.getFullYear(); var m = today.getMonth() - birthDate.getMonth(); var da = today.getDate() - birthDate.getDate(); if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) { age--; } if(m<0){ m +=12; } if(da<0){ da +=30; } return age+" years "+ Math.abs(m) + "months"+ Math.abs(da) + " days"; } alert('age: ' + getAge("1987/08/31")); [http://jsfiddle.net/tapos00/2g70ue5y/][1] 

如果你需要几个月的年龄(天是近似的):

 birthDay=28; birthMonth=7; birthYear=1974; var today = new Date(); currentDay=today.getUTCDate(); currentMonth=today.getUTCMonth() + 1; currentYear=today.getFullYear(); //calculate the age in months: Age = (currentYear-birthYear)*12 + (currentMonth-birthMonth) + (currentDay-birthDay)/30; 
 function change(){ setTimeout(function(){ var dateObj = new Date(); var month = dateObj.getUTCMonth() + 1; //months from 1-12 var day = dateObj.getUTCDate(); var year = dateObj.getUTCFullYear(); var newdate = year + "/" + month + "/" + day; var entered_birthdate = document.getElementById('birth_dates').value; var birthdate = new Date(entered_birthdate); var birth_year = birthdate.getUTCFullYear(); var birth_month = birthdate.getUTCMonth() + 1; var birth_date = birthdate.getUTCDate(); var age_year = (year-birth_year); var age_month = (month-birth_month); var age_date = ((day-birth_date) < 0)?(31+(day-birth_date)):(day-birth_date); var test = (birth_year>year)?true:((age_year===0)?((month<birth_month)?true:((month===birth_month)?(day < birth_date):false)):false) ; if (test === true || (document.getElementById("birth_dates").value=== "")){ document.getElementById("ages").innerHTML = ""; } else{ var age = (age_year > 1)?age_year:( ((age_year=== 1 )&&(age_month >= 0))?age_year:((age_month < 0)?(age_month+12):((age_month > 1)?age_month: ( ((age_month===1) && (day>birth_date) ) ? age_month:age_date) ) )); var ages = ((age===age_date)&&(age!==age_month)&&(age!==age_year))?(age_date+"days"):((((age===age_month+12)||(age===age_month)&&(age!==age_year))?(age+"months"):age_year+"years")); document.getElementById("ages").innerHTML = ages; } }, 30); }; 

从dateselect器计算年龄

  $('#ContentPlaceHolder1_dob').on('changeDate', function (ev) { $(this).datepicker('hide'); //alert($(this).val()); var date = formatDate($(this).val()); // ('2010/01/18') to ("1990/4/16")) var age = getAge(date); $("#ContentPlaceHolder1_age").val(age); }); function formatDate(input) { var datePart = input.match(/\d+/g), year = datePart[0], // get only two digits month = datePart[1], day = datePart[2]; return day + '/' + month + '/' + year; } // alert(formatDate('2010/01/18')); 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; }