JavaScript根据出生日期计算年龄

5

我将我的日历所选的出生日期传递给以下JS函数以计算年龄:

var DOBmdy = date.split("-"); 
    Bdate = new Date(DOBmdy[2],DOBmdy[0]-1,DOBmdy[1]); 
    BDateArr = (''+Bdate).split(' '); 
    //document.getElementById('DOW').value = BDateArr[0]; 
    Cdate = new Date; 
    CDateArr = (''+Cdate).split(" ");
    Age = CDateArr[3] - BDateArr[3]; 

现假设,输入的年龄为:1983年8月2日,年龄计数为:28,但由于八月份尚未到来,我希望显示当前的年龄为27而不是28
有什么想法可以在我的JS函数中编写该逻辑以完美地计算年龄27吗?
谢谢!

看起来你只是在减去年份。为什么不减去两个日期对象而不仅仅是它们的年份? - corroded
1
这可能对您有所帮助:https://dev59.com/0G855IYBdhLWcg3w-JMr#4060199 - corroded
https://dev59.com/0G855IYBdhLWcg3w-JMr#7091965 - naveen
4个回答

9

如果出生日期是1983年8月2日,那么现在与那个日期之间的毫秒差是:

var diff = new Date - new Date('1983-08-02');

两个日期之间的天数差异(1秒 = 1000毫秒,1小时 = 60 * 60秒,1天 = 24 * 1小时)。

var diffdays = diff / 1000 / (60 * 60 * 24);

年龄差(即年龄)会有所不同(.25是为了考虑闰年):
var age = Math.floor(diffdays / 365.25);

现在尝试使用它

diff = new Date('2011-08-01') - new Date('1983-08-02'); //=> 27
diff = new Date('2011-08-02') - new Date('1983-08-02'); //=> 28
diff = new Date('2012-08-02') - new Date('1983-08-02'); //=> 29

因此,您的JavaScript可以重写为:

var Bdate   = new Date(date.split("-").reverse().join('-')),
    age     = Math.floor( ( (Cdate - Bdate) / 1000 / (60 * 60 * 24) ) / 365.25 );

[编辑] 没有足够注意。 date.split('-') 得到数组 [dd,mm,yyyy],因此将其反转得到 [yyyy,mm,dd]。现在再使用'-'连接它,结果是字符串 'yyyy-mm-dd',这是一个新的 Date 的有效输入。

如何将日期格式更改为YYYY-mm-dd?我有一个日历,它返回的日期是08-02-1983...? - Aditya P Bhatt
是的,我昨天已经得到了并完成了,谢谢您的回复 :) - Aditya P Bhatt
.25真的足以处理闰年吗??你的例子救了我的命...非常感谢。 - user1598585
SO 上最佳答案。谢谢。 - Gaurav Gandhi
不要使用365.25,我认为你可能想使用365.242199。请注意,公元2000年不是闰年,大约每2000年会有一个普通年份。 - YasharF

2
也许这个可以起作用:
    var today = new Date(); 
    var d = document.getElementById("dob").value;
    if (!/\d{4}\-\d{2}\-\d{2}/.test(d)) {   // check valid format
    return false;
    }
    d = d.split("-");
    var byr = parseInt(d[0]); 
    var nowyear = today.getFullYear();
    if (byr >= nowyear || byr < 1900) {  // check valid year
    return false;
    }
    var bmth = parseInt(d[1],10)-1;  
    if (bmth<0 || bmth>11) {  // check valid month 0-11
    return false;
    }
    var bdy = parseInt(d[2],10); 
    if (bdy<1 || bdy>31) {  // check valid date according to month
    return false;
    }
    var age = nowyear - byr;
    var nowmonth = today.getMonth();
    var nowday = today.getDate();
    if (bmth > nowmonth) {age = age - 1}  // next birthday not yet reached
    else if (bmth == nowmonth && nowday < bdy) {age = age - 1}

    alert('You are ' + age + ' years old'); 

2
(new Date() - new Date('08-02-1983')) / 1000 / 60 / 60 / 24 / 365.25

这将得到您年份之间的差异,偶尔使用此方法可能会遇到一天的偏差问题。


有没有针对这个“off-by-one-day”问题的永久解决方案?如果有任何指南,将不胜感激。 - Aditya P Bhatt
@iamtheladylegend,请注意KooiInc的答案也存在“off-by-one-day”问题。此外,两个答案都使用了错误的转换因子。“365.25”对于普通西方日历是错误的。正确的比率是“365.2425”(日历,而不是天文学)。... ... Harry Joy的答案虽然复杂,但他的方法完全准确。 - Brock Adams
2
哦,拜托!如果你要纠正我,就请正确地做吧!365.242198781 - user578895
不,365.2425是正确的。我们使用公历,而且有传言称任何与365.2425的偏差都将通过调整某些年份来进行大规模调整,几秒钟(就像他们已经添加闰秒来补偿地球的减速旋转一样)。 - Brock Adams

0

我刚刚写了一个函数来实现这个功能,想和大家分享一下。

人类的角度来看,这是准确的!没有那些疯狂的365.2425之类的东西。

var ageCheck = function(yy, mm, dd) {
    // validate input
    yy = parseInt(yy,10);
    mm = parseInt(mm,10);
    dd = parseInt(dd,10);   
    if(isNaN(dd) || isNaN(mm) || isNaN(yy)) { return 0; }   
    if((dd < 1 || dd > 31) || (mm < 1 || mm > 12)) { return 0; }

    // change human inputted month to javascript equivalent 
    mm = mm - 1;

    // get today's date
    var today = new Date();
    var t_dd = today.getDate();
    var t_mm = today.getMonth();
    var t_yy = today.getFullYear(); 

    // We are using last two digits, so make a guess of the century 
    if(yy == 0) { yy = "00"; }
    else if(yy < 9) { yy = "0"+yy; }    
    yy = (today.getFullYear() < "20"+yy ? "19"+yy : "20"+yy);

    // Work out the age!
    var age = t_yy - yy - 1; // Starting point
    if( mm < t_mm ) { age++;} // If it's past their birth month
    if( mm == t_mm && dd <= t_dd) { age++; } // If it's past their birth day

    return age;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接