From 35259e57674fda869078f4da9d8cc37f10b6a956 Mon Sep 17 00:00:00 2001 From: czifumasa Date: Wed, 27 Apr 2022 17:16:23 +0200 Subject: [PATCH] Fix age calc, missing leap day for years divisible by 100 and not by 400 (#96) --- src/util/age_util.spec.ts | 12 ++++++++++++ src/util/age_util.ts | 19 +++++++++++++++---- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/util/age_util.spec.ts b/src/util/age_util.spec.ts index 072f7c9..1058d1d 100644 --- a/src/util/age_util.spec.ts +++ b/src/util/age_util.spec.ts @@ -32,6 +32,18 @@ describe('calcAge()', () => { const age = calcAge('2 Sep 1990', '1 Sep 2021', intl); expect(age).toEqual('30 years'); }); + it('age respecting missing leap year divisible by 100 and not divisible by 400', () => { + const age = calcAge('1890', '1921', intl); + expect(age).toEqual('31 years'); + }); + it('age respecting missing leap year divisible by 100 and not divisible by 400 for full dates', () => { + const age = calcAge('1 Sep 1890', '1 Sep 1921', intl); + expect(age).toEqual('31 years'); + }); + it('age with round down respecting missing leap year divisible by 100 and not divisible by 400', () => { + const age = calcAge('2 Sep 1890', '1 Sep 1921', intl); + expect(age).toEqual('30 years'); + }); it('age with exact and range between', () => { const age = calcAge('1990', 'BET 2020 AND 2021', intl); diff --git a/src/util/age_util.ts b/src/util/age_util.ts index f33e9b7..e307071 100644 --- a/src/util/age_util.ts +++ b/src/util/age_util.ts @@ -115,10 +115,21 @@ function calcDateDifferenceInYears( const firstDateObject = toDateObject(firstDate); const secondDateObject = toDateObject(secondDate); - const dateDiff = new Date( - secondDateObject.valueOf() - firstDateObject.valueOf(), - ); - return Math.abs(dateDiff.getUTCFullYear() - 1970); + const startYear = firstDateObject.getUTCFullYear(); + + let yearDiff = secondDateObject.getUTCFullYear() - startYear; + let monthDiff = secondDateObject.getUTCMonth() - firstDateObject.getUTCMonth(); + if (monthDiff < 0) { + yearDiff--; + monthDiff += 12; + } + const dayDiff = secondDateObject.getUTCDate() - firstDateObject.getUTCDate(); + if (dayDiff < 0) { + if (monthDiff <= 0) { + yearDiff--; + } + } + return Math.abs(yearDiff); } export function calcAge(