Age (+leap year) calculation in Javascript?

前端 未结 3 1405
-上瘾入骨i
-上瘾入骨i 2021-02-09 15:34

I\'ve read this question but there were many comments which some said it was accurate and some said it wasn\'t accurate.

Anyway I have this code which calc pers

3条回答
  •  没有蜡笔的小新
    2021-02-09 16:14

    Your diff calculation will give you the number of days between the two dates. It will take into account leap years, so over exactly 4 years it will yield (365 * 4) + 1 days.

    It will also count partial days so if the date parameter is noon yesterday and today it is 6am then diff will be 0.75.

    How you convert from days to years is up to you. Using 365, 365.242, or 365.25 days per year all are reasonable in the abstract. However, since you are calculating people's ages according to their birthdays, I would do it like this http://jsfiddle.net/OldPro/hKyBM/ :

    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
    }
    

    In other words, I compute the fractional year as number of days since the last birthday divided by the number of days between the previous birthday and the next birthday. I think that is how most people think of birthdays and years.

    Note: You can get into trouble with timezones when converting date strings to Dates. Short ISO 8601 dates like '2013-05-14' are interpreted as midnight UTC which makes that date May 13, not May 14 in the US and everywhere else with negative UTC offsets. So be careful.

提交回复
热议问题