【问题标题】:Javascript Age count from Date of Birth从出生日期算起的 Javascript 年龄
【发布时间】:2011-04-26 05:07:42
【问题描述】:

我正在将我选择的日历 date of birth 传递给以下用于计算年龄的 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]; 

现在,假设输入年龄为:2nd Aug 1983,年龄计数为:28,而由于尚未过去八月,我想显示27 的当前年龄而不是28

任何想法,我该如何编写该逻辑,以使用我的 JS 函数计算年龄 27 完美

谢谢!

【问题讨论】:

标签: javascript


【解决方案1】:

出生日期为 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);

年的差异(即年龄)变为(考虑闰年的 0.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 .. ?
  • 是的,最后一天已经完成了,感谢您的回复 :)
  • .25 真的足以应付闰年吗?你的例子救了我的命......非常感谢。
  • 最好的答案在 SO。 TY
  • 我想你可能想做 365.242199 而不是 365.25。请注意,2000 年不是闰年,而是正常年份,大约每 2000 年一次。
【解决方案2】:
(new Date() - new Date('08-02-1983')) / 1000 / 60 / 60 / 24 / 365.25

这会让你在年限上有所不同,你会偶尔在使用这个时遇到过时的问题。

【讨论】:

  • 这个off-by-one-day问题的任何永久解决方案??任何指南将不胜感激..
  • @iamtheladylegend,请注意,KooiInc 的答案与off-by-one-day 问题完全相同。此外,两个答案都使用了错误的转换因子。 365.25 对常见的西方日历来说是错误的。正确的比率是365.2425(日历,不是天文数字)。 ... ... Harry Joy 的回答令人费解,但他的方法非常准确。
  • 哦,来吧!如果你要纠正我,那就做对吧! 365.242198781
  • 不,365.2425 is correct. We use the Gregorian calendar,并且有传言说,与 365.2425 的任何偏差都会由老大哥通过摆弄选定年份来调整几秒钟(就像他们已经添加闰秒来补偿地球的缓慢自转)。
【解决方案3】:

这可能有效:

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

【讨论】:

    【解决方案4】:

    我只需要编写一个函数来执行此操作,并认为我会分享。

    人类的角度来看,这是准确的!没有那些疯狂的 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多