根据出生日期计算年龄,格式为YYYYMMDD

如果给出格式为YYYYMMDD的出生日期,如何以年计算年龄?是否可以使用Date()函数?

我正在寻找一个比我现在使用的更好的解决方案:

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

578671 次浏览

不久前,我做了一个这样的函数:

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对象作为输入,所以你需要解析'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

为了测试生日是否已经过去,我定义了一个辅助函数Date.prototype.getDoY,它有效地返回一年中的天数。剩下的就不言自明了。

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

试试这个。

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/

这是我修改的尝试(用一个字符串传递给函数而不是一个日期对象):

function calculateAge(dobString) {
var dob = new Date(dobString);
var currentDate = new Date();
var currentYear = currentDate.getFullYear();
var birthdayThisYear = new Date(currentYear, dob.getMonth(), dob.getDate());
var age = currentYear - dob.getFullYear();


if(birthdayThisYear > currentDate) {
age--;
}


return age;
}

和用法:

console.log(calculateAge('1980-01-01'));

我只是不得不为自己写这个函数-接受的答案是相当好的,但IMO可以使用一些清理。这需要一个unix时间戳的dob,因为这是我的要求,但可以迅速适应使用字符串:

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时间戳或字符串,显然需要删除1000的因子。

这是我的解决方案,只需要传入一个可解析的日期:

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
}

我知道这是一个非常古老的线程,但我想把这个实现放在我写的寻找年龄,我相信这是更准确的。

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

当然,你可以调整它以适应其他获取参数的格式。希望这有助于人们寻找更好的解决方案。

替代解决方案,因为为什么不呢:

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

获取欧洲日期输入时的年龄:

getAge('16-03-1989')

重要提示:这个答案并不能提供100%的准确答案,根据日期的不同,它会有10-20个小时的误差。

没有更好的解决方案(至少在这些答案中没有)。——纳文

我当然抑制不住接受挑战的冲动,做一个比目前公认的解决方案更快更短的生日计算器。 我的解决方案的要点是,数学是快速的,所以不是使用分支和日期模型javascript提供的计算解决方案,我们使用美妙的数学

答案是这样的,运行速度比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天。最后,我对给出最终年龄的结果进行了floor运算

下面是基准测试:http://jsperf.com/birthday-calculation

要支持OP的数据格式,可以替换+new Date(dateString);
+new Date(d.substr(0, 4), d.substr(4, 2)-1, d.substr(6, 2)); < / p >

如果你能想出一个更好的解决方案,请分享!: -)

下面是我能想到的最简单、最准确的解决方案:

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

它甚至适用于负年龄!

我会选择可读性:

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

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

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


我在这里测试的所有答案(大约一半)都认为2000-02-29到2001-02-28是0年,而从2000-02-29到2001-03-01最有可能是1年,即1年零1天。下面是一个getYearDiff函数来修复这个问题。它只适用于d0 < d1:

function getYearDiff(d0, d1) {


d1 = d1 || new Date();


var m = d0.getMonth();
var years = d1.getFullYear() - d0.getFullYear();


d0.setFullYear(d0.getFullYear() + years);


if (d0.getMonth() != m) d0.setDate(0);


return d0 > d1? --years : years;
}

还有另一个解决方案:

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

momentjs:

/* The difference, in years, between NOW and 2012-05-07 */
moment().diff(moment('20120507', 'YYYYMMDD'), 'years')
使用momentjs "fromNow"方法, 这允许您使用格式化的日期,例如:03/15/1968

var dob = document.getElementByID("dob"); var age = moment(dob.value).fromNow(true).replace(" years", ""); < /代码> < / p > < p > <代码> / /可以(真正的)=比;不显示后缀“ago” //但是我们还是要去掉“years”; < /代码> < / p >

作为原型版本

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

试试这个:

$('#Datepicker').change(function(){


var $bef = $('#Datepicker').val();
var $today = new Date();
var $before = new Date($bef);
var $befores = $before.getFullYear();
var $todays = $today.getFullYear();
var $bmonth = $before.getMonth();
var $tmonth = $today.getMonth();
var $bday = $before.getDate();
var $tday = $today.getDate();


if ($bmonth>$tmonth)
{$('#age').val($todays-$befores);}


if ($bmonth==$tmonth)
{
if ($tday > $bday) {$('#age').val($todays-$befores-1);}
else if ($tday <= $bday) {$('#age').val($todays-$befores);}
}
else if ($bmonth<$tmonth)
{ $('#age').val($todays-$befores-1);}
})
我使用这种方法用逻辑而不是数学。 它既精确又快速。 参数是这个人生日的年、月和日。 它以整数形式返回这个人的年龄
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;
}
}
}

我有一个漂亮的答案,虽然它不是我的代码。不幸的是,我忘记了原来的帖子。

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;
$("#birthday").change(function (){




var val=this.value;


var current_year=new Date().getFullYear();
if(val!=null){
var Split = val.split("-");
var birth_year=parseInt(Split[2]);


if(parseInt(current_year)-parseInt(birth_year)<parseInt(18)){


$("#maritial_status").attr('disabled', 'disabled');
var val2= document.getElementById("maritial_status");
val2.value = "Not Married";
$("#anniversary").attr('disabled', 'disabled');
var val1= document.getElementById("anniversary");
val1.value = "NA";


}else{
$("#maritial_status").attr('disabled', false);
$("#anniversary").attr('disabled', false);


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


};

从日期选择器计算年龄

         $('#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;
}

从naveen和原始OP的帖子中采用,我最终得到了一个可重用的方法存根,它接受字符串和/或JS Date对象。

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

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

我希望这对你有所帮助

以下是计算年龄的简单方法:

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

我认为可以简单地像这样:

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

也适用于时间戳

age(403501000000)
//34

使用javascript从出生日期开始获取年龄(年,月和日)

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

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

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

使用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

我使用的是365.25天的一年(因为闰年是0.25天),分别是3.15576e+10毫秒(365.25 * 24 * 60 * 60 * 1000)。

它有几个小时的剩余时间,所以根据用例,它可能不是最佳选择。

伙计们,这对我来说再合适不过了。

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

你可以在你的表格中使用这个年龄限制

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

这是我的修改:

  function calculate_age(date) {
var today = new Date();
var today_month = today.getMonth() + 1; //STRANGE NUMBERING //January is 0!
var age = today.getYear() - date.getYear();


if ((today_month > date.getMonth() || ((today_month == date.getMonth()) && (today.getDate() < date.getDate())))) {
age--;
}


return age;
};

这对我来说是最优雅的方式:

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

我有点晚了,但我发现这是计算出生日期的最简单的方法。

希望这能有所帮助。

function init() {
writeYears("myage", 0, Age());


}


function Age() {
var birthday = new Date(1997, 02, 01), //Year, month-1 , 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);
}
}
init()
<span id="myage"></span>

如果年龄只是为了显示(可能不是100%准确),下面的答案是一个很好的方法,但至少它更容易让你理解

function age(birthdate){
return Math.floor((new Date().getTime() - new Date(birthdate).getTime()) / 3.154e+10)
}

我相信在这种情况下,有时可读性更重要。除非我们要验证1000个字段,否则这应该足够准确和快速:

function is18orOlder(dateString) {
const dob = new Date(dateString);
const dobPlus18 = new Date(dob.getFullYear() + 18, dob.getMonth(), dob.getDate());
  

return dobPlus18 .valueOf() <= Date.now();
}


// Testing:
console.log(is18orOlder('01/01/1910')); // true
console.log(is18orOlder('01/01/2050')); // false


// When I'm posting this on 10/02/2020, so:
console.log(is18orOlder('10/08/2002')); // true
console.log(is18orOlder('10/19/2002'))  // false

我喜欢这种方法,而不是用一个常数来表示一年有多少毫秒,然后再弄乱闰年等等。让内置的Date来做这个工作。

更新,发布这个片段,因为有人可能会发现它有用。由于我在输入字段上强制了一个掩码,为了拥有mm/dd/yyyy的格式并已经验证日期是否有效,在我的例子中,这也适用于验证18+年:

 function is18orOlder(dateString) {
const [month, date, year] = value.split('/');
return new Date(+year + 13, +month, +date).valueOf() <= Date.now();
}

这个问题已经超过10年了,没有人回答过提示,他们已经有了YYYYMMDD格式的出生日期?

如果你有一个YYYYMMDD格式的过去日期和当前日期,你可以像这样快速计算它们之间的年数:

var pastDate = '20101030';
var currentDate = '20210622';
var years = Math.floor( ( currentDate - pastDate ) * 0.0001 );
// 10 (10.9592)

你可以像这样获得当前日期格式为YYYYMMDD:

var now = new Date();


var currentDate = [
now.getFullYear(),
('0' + (now.getMonth() + 1) ).slice(-2),
('0' + now.getDate() ).slice(-2),
].join('');

短而准确(但不是超级可读):

let age = (bdate, now = new Date(), then = new Date(bdate)) => now.getFullYear() - then.getFullYear() - (now < new Date(now.getFullYear(), then.getMonth(), then.getDate()));
let dt = dob;


let age = '';


let bY = Number(moment(dt).format('YYYY'));
let bM = Number(moment(dt).format('MM'));
let bD = Number(moment(dt).format('DD'));


let tY = Number(moment().format('YYYY'));
let tM = Number(moment().format('MM'));
let tD = Number(moment().format('DD'));




age += (tY - bY) + ' Y ';


if (tM < bM) {
age += (tM - bM + 12) + ' M ';
tY = tY - 1;
} else {
age += (tM - bM) + ' M '
}


if (tD < bD) {
age += (tD - bD + 30) + ' D ';
tM = tM - 1;
} else {
age += (tD - bD) + ' D '
}
        

//AGE MONTH DAYS
console.log(age);