2011-04-26 63 views
5

我路过选择date of birth我的日历日期算到下面的JS函数计算年龄:的Javascript年龄从出生

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

现在,让我们说,输入年龄:2nd Aug 1983和年龄数来:28,而截至8月尚未通过,我想说明的27目前的年龄,而不是28

任何想法,我怎么能写出逻辑,算年龄27完美我的JS功能。

谢谢!

+0

看起来像你只是减去一年。为什么不减去2个日期对象而不是他们的年份? – corroded 2011-04-26 05:13:56

+1

这可能也帮助你:http://stackoverflow.com/questions/4060004/calculate-age-in-javascript/4060199#4060199 – corroded 2011-04-26 05:20:44

+0

http://stackoverflow.com/a/7091965/17447 – naveen 2013-06-09 17:29:48

回答

10

出生日期是1983年8月2日,然后以毫秒为单位,现在的这个日期之间的区别是:

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

天不同的是(1秒= 1000ms,1小时= 60 * 60秒,1天= 24 * 1小时)

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

在年(所以,年龄)成为(.25占leapyears)的区别:

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的有效输入。

+0

如何将日期格式更改为YYYY-mm-dd?我有日历,它返回我的日期为08-02-1983 ..? – 2011-04-26 12:50:07

+0

@iamtheladylegend:看我的编辑 – KooiInc 2011-04-26 14:37:38

+0

是的,已经得到了最后一天,并完成,感谢您的回应:) – 2011-04-27 05:55:37

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

,将让你在多年的不同,你会偶尔运行到的off-by-一天使用这个问题。

+0

任何永久的解决方案''一天'问题?任何指南,将不胜感激。 – 2011-04-26 06:53:07

+0

@iamtheladylegend,请注意,KooiInc的答案具有完全相同的“关闭一天”问题。这两个答案都使用错误的转换因子。 '365。对于普通的西方日历,25'是错误的。正确的比率是'365.2425'(日历,不是天文数字)。 ......哈利·乔伊的回答很复杂,但他的方法非常准确。 – 2011-05-08 06:40:44

+2

哦,来吧!如果你要改正我的话,那就对了! '365.242198781' – 2011-05-08 08:31:55

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