Javascript中的年龄(闰年)计算?

Javascript中的年龄(闰年)计算?,javascript,math,datetime,Javascript,Math,Datetime,我读过这篇文章,但是有很多评论,有些人说它是准确的,有些人说它不准确 总之,我有一段代码,用Javascript计算人的年龄: function calculateDiffYearByString(date) { var cur = new Date(); var diff = (cur.getTime() - new Date(date)) / (60 * 60 * 24 * 1000); return diff / 365.242;

我读过这篇文章,但是有很多评论,有些人说它是准确的,有些人说它不准确

总之,我有一段代码,用Javascript计算人的年龄:

 function calculateDiffYearByString(date)
    {
        var cur = new Date();
        var diff = (cur.getTime() - new Date(date)) / (60 * 60 * 24 * 1000);
        return diff / 365.242;
    }
现在,, 这部分
var diff=(cur.getTime()-新日期(Date))/(60*60*24*1000) <强> < /强>考虑从开始日期到结束日期<强>的所有实际天数(24小时),包括< /强>闰年考虑。
它只是按24小时分组计算天数。
我的问题是关于
/365.242

当我问谷歌时,它说:

这就是为什么我选择365.242

但我想我错了。因为(
.242
部分与闰年有关。因此,我认为恐怕闰年在总体计算中被考虑了两次


我错了吗?我的计算是否100%正确?

计算日期之间差异的方法将以天为单位给出结果,并且它考虑了闰年

但是,您的函数是以年为单位返回值的,因此您需要将单位从天转换为年,为了准确起见,此转换需要.242,因此您的逻辑似乎是合理的

编辑:为了获得类似于年龄计算器预期的回报,您必须获得两个日期的日、月和年,使用日和月检查该日期是在另一个日期之后还是之前,然后减去年并可选地添加1,例如:

function getAge(dateStr) {
  var cur = new Date();
  var tar = new Date(dateStr);

  // Get difference of year
  var age = cur.getFullYear() - tar.getFullYear();

  // If current month is > than birth month he already had a birthday
  if (cur.getMonth() > tar.getMonth()) {
     age ++;
  } 
  // If months are the same but current day is >= than birth day same thing happened 
  else if (cur.getMonth() == tar.getMonth() && cur.getDate() >= tar.getDate()) {
     age ++;
  }

  return age;
}
您可以修改>=或比较小时以获得更详细的信息,但这对于大多数年龄计算要求来说应该足够了


基本上,从科学的角度来看,使用.242可以得到更准确的结果,但是从社会的角度来看,年龄计算并不准确。

由于假设一年为365.242天,因此计算不正确

一年平均为365.242天,但没有实际的一年是365.242天。一年可以是365天,也可以是366天(忽略某些年份有闰秒的小细节)

要准确地将年龄计算为分数年,您必须计算截至上一个生日的完整年数,然后根据当前年份的天数计算当前年份的分数


您可以使用这样的代码来计算准确的年龄(以年为单位):

function isLeapYear(year) {
    var d = new Date(year, 1, 28);
    d.setDate(d.getDate() + 1);
    return d.getMonth() == 1;
}

function getAge(date) {
    var d = new Date(date), now = new Date();
    var years = now.getFullYear() - d.getFullYear();
    d.setFullYear(d.getFullYear() + years);
    if (d > now) {
        years--;
        d.setFullYear(d.getFullYear() - 1);
    }
    var days = (now.getTime() - d.getTime()) / (3600 * 24 * 1000);
    return years + days / (isLeapYear(now.getFullYear()) ? 366 : 365);
}

var date = '1685-03-21';

alert(getAge(date) + ' years');
演示:


(注意:天数也是一个分数,因此它会将年龄计算到精确的毫秒。如果您想要完整的天数,您可以在
days
变量的计算周围添加
Math.floor

您的
diff
计算将给出两个日期之间的天数。它将考虑闰年,因此在整整4年内,它将产生
(365*4)+1

它还将计算部分天数,因此如果
日期
参数是昨天中午,而今天是早上6点,那么
diff
将是
0.75

如何将天数转换为年份取决于您。每年使用365天、365.242天或365.25天,从理论上讲都是合理的。然而,由于你是根据人们的生日来计算年龄,我会这样做:

换句话说,我将分数年计算为自上一个生日起的天数除以上一个生日和下一个生日之间的天数。我想这就是大多数人对生日和年份的看法


注意:将日期字符串转换为日期时,您可能会遇到时区问题。较短的ISO 8601日期,如“2013-05-14”被解释为UTC午夜,这使得该日期为5月13日,而不是5月14日,在美国和其他任何具有负UTC偏移的地方。所以要小心。

哦,这让我想起了乔恩·斯基特的演讲。你为什么要用这种方式计算日期差异?对不起,我对你的主题没有任何疑问……你是如何让截图的右侧和底部都有这种撕裂效果的?:)@Petterhietavirta(我也看到了他的表现——和Tony:-))无论如何,我知道还有其他选择。但我想纠正我的错误。(如果有的话),这样我就能更好地理解我的错误在哪里:——)@david99world如果一个人出生在2012年1月28日,你问她2012年2月29日的年龄,你期望的结果是什么?2012年3月1日的结果是什么?是否每年都包含.242?.242部分不也是闰年吗?.242允许你以一种精确的方式转换,闰年的存在是为了方便普通人的生活,毕竟要在午夜后等待大约6个小时来庆祝新年是很烦人的:)我怎么知道一个给定的年份-确切的天数是多少?@RoyiNamir:您可以为当年2月28日创建一个
Date
对象,然后在其中添加一天。如果日期仍在2月,则一年有366天。@alex23:结果大致正确,但函数返回的确切值永远不完全正确。计算一个正确的年平均数比简单地计算准确的年数要复杂得多。@alex23:OP问“我的计算是100%正确吗?”。答案很简单,除了一个年龄完全为零的特殊情况外,它从来都不是。我正在寻找一段代码,它将实现最准确的分辨率。(日分辨率)。嗨。让我们说,从我出生的那天起,上帝就一直与我同在,他每天都在数数日子。它的计算方法是:
var now=newdate();var utc=新日期(Date.utc(now.getFullYear(),now.getMonth(),now.getDate())-Date.utc(1978,11,22);警报(utc/1000/60/60/24)//
结果为12563(天)。现在我如何从这个数字中得出年(和天)?12563/365=标称年。12563/356.25近似值
function noon(date) {
    // normalize date to noon that day
    return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 12, 0, 0, 0);
}

// Takes a Date
function getAge(date) {
    var now = noon(new Date()),
        birthday = noon(date),
        thisBirthday = new Date(birthday),
        prevBirthday,
        nextBirthday,
        years,
        partYear,
        msInYear;
    thisBirthday.setFullYear(now.getFullYear());

    if (thisBirthday > now) { // not reached birthday this year
        nextBirthday = thisBirthday;
        prevBirthday = new Date(thisBirthday);
        prevBirthday.setFullYear(now.getFullYear() - 1);
    }
    else {
        nextBirthday = new Date(thisBirthday);
        nextBirthday.setFullYear(now.getFullYear() + 1);
        prevBirthday = thisBirthday;
    }
    years = prevBirthday.getFullYear() - birthday.getFullYear();
    msInYear = nextBirthday - prevBirthday;
    partYear = (now - prevBirthday) / msInYear;

    return years + partYear
}