在Javascript中计算年龄(+闰年)?

Roy*_*mir 6 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;
    }
Run Code Online (Sandbox Code Playgroud)

现在,这部分var diff = (cur.getTime() - new Date(date)) / (60 * 60 * 24 * 1000); 确实考虑了从开始日期到结束日期的所有实际日期(24小时), 包括闰年考虑.

这只是24小时的团队计算天数.我的问题是关于/ 365.242;

当我问谷歌时,它说:

在此输入图像描述

这就是我将其与365.242分开的原因.

但我觉得我错了.因为(恕我直言)该.242部分是关于闰年.所以我觉得我害怕闰年在整体计算中被考虑两次.

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

Guf*_*ffa 5

该计算是不正确的,因为假设一年为365.242天。

一年平均为365.242天,但没有实际年为365.242天。一年恰好是365天或366天(忽略一些细节,有些年份会有leap秒。)

要将年龄精确地计算为小数年,您将必须计算到上一个生日为止的总年数,然后根据当年的多少天来计算当年的小数。


您可以使用如下代码来计算确切的年龄(以年为单位):

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');
Run Code Online (Sandbox Code Playgroud)

演示:http//jsfiddle.net/Guffa/yMxck/

(请注意:天数也是一个小数,因此它将精确计算毫秒数。如果您希望整天都可以Math.floor为该days变量添加一个计算值。)