2011-04-26 62 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; 
}