以YYYYMMDD格式计算给定生日的年龄


284

给定出生日期格式为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);


请注意格式化,不要像以前那样做。只需使用代码(010101)按钮或Ctrl-K将代码缩进4个空格。
马塞尔·科佩尔

我确实做到了,但是它无法在IE9 Beta上运行,所以我不得不手工完成。
Francisc

4
在计算年龄时,原始解决方案比当前答案更好。尤里奥·桑托斯(JúlioSantos)的回答本质上是同一回事。其他答案在许多情况下给出的结果都不准确,并且可能不太直接或效率较低。
布罗克·亚当斯

谢谢布洛克。我希望有比这似乎有点粗糙的方法更优雅的方法。
Francisc

4
@Francisc,这很粗糙,但这是Date对象封装后必须执行的操作。人们可以写一些有关JS Date处理麻烦的书。...如果您有时可以放假一天,那么近似值:AgeInYears = Math.floor ( (now_Date - DOB_Date) / 31556952000 )尽可能地简单。
布罗克·亚当斯

Answers:


245

我会为了可读性而去:

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,可能是最准确的,因为它不依赖于一天中的时间。


基准:http//jsperf.com/birthday-calculation/15


3
对于可能从2000
2

16
@RobG从技术上讲,我认为从2000年2月29日到2001年2月28日都不是整整一年,因此您的答案无效。没什么意义,从2000-02-28到2001-02-28是一年,所以2000-02-29到2001-02-28必须少于一年。
安德烈Snede科克

3
您没有详细说明“不精确”的含义,我认为其他信息可能会有所帮助。您可以考虑解决问题或删除答案。
RobG 2014年

1
@RobG其实我做到了。我还指出了比我自己的解决方案更好的解决方案。我的解决方案以一种易于阅读的方式解决了该问题,并具有较小的精度问题,但在其目的范围内。
安德烈Snede科克

1
@AndréSnedeHansen的答案很可爱,而且速度也很快,因为您没有我的答案中那样疯狂的划分;-) +1的可读性和速度。
Kristoffer Dorph

506

尝试这个。

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/


你能举个例子吗?如果不修改该函数以使用3个单独的参数,例如:getAge(y,m,d),我将无法使其正常工作。例如:jsbin.com/ehaqiw/1/edit
edt

像许多其他人一样,这认为2000-02-29到2001-02-28是零年,最有可能应该是1年(因为2001-03-01应该是1年1天)。
RobG 2014年

3
@RobG:当leaplings“庆祝”(常见问题的答案其实只是似乎是:“周末最接近实际日期”)在其出生天的不同根据上下文,包括:地理区域(简单的英文:你住的地方),法律(请不要小看),宗教信仰和个人喜好(包括团体行为):某些原因:“我出生于2月”,其他原因:“我出生于2月28日后的第二天” (最常见的是3月1日)en.wikipedia.org/wiki/February_29如果上述3月1日是one年的结果,那么上述算法都是正确的
GitaarLAB 2015年

3
@RobG:“加x个月”的后缀与人的年龄概念无关。人类普遍的观念是,当日历具有相同的月份#和日期#(与开始日期相比)时,年龄(年)计数器每天(不考虑时间)增加:因此从2000-02-28到2001-02 -27 = 0年,而2000-02-28至2001-02-28 = 1年。将“常识”扩展到跨越式发展:2000-02-29(2000-02-28 之后的一天)到2001-02-28 = 零年。我的评论只是说,如果人们期望/同意这种跨越式逻辑,那么答案算法总是给出“正确的” 人类答案
GitaarLAB '16

3
@RobG:我从未说过我,或者答案是普遍正确的(TM)。我包括上下文/管辖区/观点的概念。我的两条评论都清楚地包含了一个大写的IF(旨在处理异常跨越)。实际上,我的第一句话完全表达了我的意思,从不包括对与错的任何判断。实际上,我的评论阐明了此答案(以及您所说的“突出问题”)中不期望什么以及为什么不期望(以及为什么)。诗:2月31日?
GitaarLAB '16

72

重要提示:此答案无法提供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天。最后,我决定了最终的年龄。

这是基准:http : //jsperf.com/birthday-calculation

为了支持OP的数据格式,您可以替换+new Date(dateString);
+new Date(d.substr(0, 4), d.substr(4, 2)-1, d.substr(6, 2));

如果您能提出更好的解决方案,请分享!:-)


那是一个很酷的解决方案。我看到的唯一问题是该dateString参数恰好适合Date()构造函数正确解析它。例如,采用YYYYMMDD我在问题中给出的格式,它将失败。
Francisc

22
这个答案有一个错误。将您的时钟设置为12:01 am。在凌晨12:01,如果您calcAge('2012-03-27')(今天的日期),即使答案等于1,您也会得到零的答案。此错误在整个12:00 am时间内都存在。这是由于错误的说法,即一年中有365.25天。它不是。我们处理的是日历年,而不是地球轨道的长度(更准确地说是365.256363天)。一年有365天,a年有366天。除此之外,在这样的事情上的表现是没有意义的。可维护性更为重要。
埃里克·布兰德尔2013年

1
感谢您的解决方案Kristoffer。我可以问一下+ new和new之间的比较,以及返回中的两个波浪号(〜)吗?
弗兰克·詹森

1
@FrankJensen嗨弗兰克,我很好奇过,发现这个答案:双波浪线转换漂浮到整数问候
Stano

1
@FrankJensen本质上将波浪号转换为数字(二进制​​值),同时将float转换为整数(被泛洪),因此,两个波浪号可为您提供四舍五入的数字。new Date()前面的+将对象转换为日期对象的整数表示形式,也可以将其用于数字字符串,例如+ '21'=== 21
Kristoffer Dorph

55

使用momentjs:

/* The difference, in years, between NOW and 2012-05-07 */
moment().diff(moment('20120507', 'YYYYMMDD'), 'years')

2
@RicardoPontual这需要momentjs,所以不可能是最好的答案。
itzmukeshy7'7

13
@ itzmukeshy7确实是一个最佳答案,它至少应该使用jQuery;)
thomaux

@thomaux完全取决于开发环境!
itzmukeshy7

@ itzmukeshy7放松一下,这是个玩笑;)参见:meta.stackexchange.com/a/19492/173875
thomaux

2
@thomaux我知道这是个玩笑;)
itzmukeshy7

38

使用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天(由于leap年而为0.25),分别为3.15576e + 10毫秒(365.25 * 24 * 60 * 60 * 1000)。


1
该死的干净利落-您能详细说明3.15576e + 10的含义吗?
leonheess

1
是的,最好在函数之前添加以下行:const yearInMs = 3.15576e+10 // Using a year of 365.25 days (because leap years)
Lucas Janon '19

12

前一段时间,我为此目的创建了一个函数:

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

啊,是的,我错过了the年。谢谢。
Francisc

1
这为选择的日期组合提供了无效的值!例如,如果birthDate1980年1月5日,和当前日期2005年1月4日,则该函数将错误地报告age为25 ...正确的值是24
布鲁克·亚当斯

@BrockAdams为什么会这样?我目前遇到这个问题。谢谢。
杰克H

@VisionIncision,因为它无法正确处理边缘条件。信不信由你,这个问题的代码是最好的方法-尽管看起来后面的答案之一可能更合适地重新包装了它。
布罗克·亚当斯

CMS Hi :-)我写了这个问题(stackoverflow.com/questions/16435981/…),并被告知如果我想要100%准确的答案,我应该每年检查一次-如果是a年,然后计算最后一个分数。(请参阅Guffa的答案)。您的函数(其中的一部分)做到了。但是如何使用它来计算100%准确的年龄?DOB很少以1/1 / yyyy开始.....所以我怎么用你的函数来计算确切的年龄?
罗伊·纳米尔

10

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

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
}

7

替代解决方案,因为为什么不这样做:

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

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

感谢容易找到年龄的年份和月份
Sumit Kumar Gupta

5

为了测试生日是否已经过去,我定义了一个helper函数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));

2月28日之后的生日,这会导致leap年的结果不准确。它使这类人老化1天。EG:对于DoB = 2001/07/04,此函数将在2008/07/03返回7年。
布罗克·亚当斯

@Brock:谢谢。如果我没有记错的话,我已经纠正了这种错误的行为。
马塞尔·科佩尔

是的,我认为您可能已经(尚未经过严格测试,只是进行了分析)。但是,请注意,新的解决方案比OP的解决方案更简单,更优雅(不包括此解决方案已正确封装在函数中)。... OP的解决方案更易于理解(因此可以进行审核,测试或修改)。IMO有时最好简单明了。
布罗克·亚当斯

@Brock:我完全同意:我必须考虑一下此功能的作用,但这绝不是一件好事。
Marcel Korpel 2011年

“ if(doyNow <doyBirth)”不应该是“ if(doyNow <= doyBirth)”吗?在我所有的测试中,这一天已经过去了一天,这已经解决了。
Ted Kulp

5

我认为可能只是这样:

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

该代码将计算出一整年都具有相同年龄的人。在您的示例中,如果今天是'09 / 19/2018',代码将为37,但年龄(生日前一天)将为36 ...
Steve Goossens

4

我只需要自己编写此函数-可接受的答案还不错,但IMO可以使用一些清理方法。这需要dob的unix时间戳,因为这是我的要求,但可以快速调整以使用字符串:

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因子。


n未定义。我认为您的意思是now.getFullYear()
拉里·

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


3

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

2

我检查了之前显示的示例,但在所有情况下都无法正常运行,因此,我编写了自己的脚本。我对此进行了测试,并且效果很好。

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

2000-02-29至2001-02-28应该是一年吗?如果是这样,那么以上内容并不完美。:-)
RobG 2014年

2

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

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


1

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

1

伙计们,对我来说很完美。

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

0

我知道这是一个非常老的线程,但是我想输入我写的这个实现,以找到我认为更准确的年龄。

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

当然,您可以对此进行调整以适合获取参数的其他格式。希望这可以帮助寻求更好解决方案的人。


0

我使用这种方法使用逻辑而不是数学。精确而快速。参数是该人生日的年,月和日。它以整数形式返回该人的年龄。

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

根据OP输入的字符串或日期对象
nazim 2016年

0

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


0

还有两个选择:

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

0

我已经对上一个答案做了一些更新。

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

希望对您有帮助:D


0

这是一种计算年龄的简单方法:

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

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

它与现在和出生年份之间仅存在简单的年份差异。然后,如果今天今天比生日早,则减去一年(考虑一下,您的年龄在一年中的生日那天上升)
Steve Goossens

0

您可以将其用于表格中的年龄限制-

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

0

我为时已晚,但我发现这是计算出生日期的最简单方法。

$(document).ready(init);

function init()
{
  writeYears("myage", 0, Age());
  $(".captcha").click(function()
  {
    reloadCaptcha();
  });

}

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

HTML标记:

<span id="myage"></span>

希望这会有所帮助。


-1

这是我能想到的最简单,最准确的解决方案:

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

它甚至可以在负数年龄使用!


像其他所有人一样,它认为2000-02-29至2001-02-28为零年。
RobG 2014年

我已经更新了答案,以适应the年边缘情况。感谢@RobG
wizulus 2014年

-1

另一个解决方案:

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

-1

使用momentjs “ fromNow”方法,可以使用格式化日期,即:03/15/1968

var dob = document.getElementByID("dob"); var age = moment(dob.value).fromNow(true).replace(" years", "");

//fromNow(true) => suffix "ago" is not displayed //but we still have to get rid of "years";

作为原型版本

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

}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.