diff --git a/app/assets/javascripts/lib/utils/datetime/date_calculation_utility.js b/app/assets/javascripts/lib/utils/datetime/date_calculation_utility.js index 6484fcff769e42bdabc0a8d12512f8bdbc2f608e..9bb2884e065f2a2c2844549931bda8aa7152f548 100644 --- a/app/assets/javascripts/lib/utils/datetime/date_calculation_utility.js +++ b/app/assets/javascripts/lib/utils/datetime/date_calculation_utility.js @@ -401,6 +401,8 @@ export const nWeeksBefore = (date, numberOfWeeks, options) => /** * Returns the date `n` years after the date provided. + * When Feb 29 is the specified date, the default behaviour is to return March 1. + * But to align with the equivalent rails code, moment JS and datefns we should return Feb 28 instead. * * @param {Date} date the initial date * @param {Number} numberOfYears number of years after @@ -408,7 +410,16 @@ export const nWeeksBefore = (date, numberOfWeeks, options) => */ export const nYearsAfter = (date, numberOfYears) => { const clone = newDate(date); - clone.setFullYear(clone.getFullYear() + numberOfYears); + clone.setUTCMonth(clone.getUTCMonth()); + + // If the date we are calculating from is Feb 29, return the equivalent result for Feb 28 + if (clone.getUTCMonth() === 1 && clone.getUTCDate() === 29) { + clone.setUTCDate(28); + } else { + clone.setUTCDate(clone.getUTCDate()); + } + + clone.setUTCFullYear(clone.getUTCFullYear() + numberOfYears); return clone; }; diff --git a/spec/frontend/lib/utils/datetime_utility_spec.js b/spec/frontend/lib/utils/datetime_utility_spec.js index 73a4af2c85d141d013e2f302292a443dfd9d982b..5027c924e6331384d8b97f3502686d79e070c99b 100644 --- a/spec/frontend/lib/utils/datetime_utility_spec.js +++ b/spec/frontend/lib/utils/datetime_utility_spec.js @@ -785,11 +785,16 @@ describe('date addition/subtraction methods', () => { ); }); + // NOTE: 2024-02-29 is a leap day describe('nYearsAfter', () => { it.each` date | numberOfYears | expected ${'2020-07-06'} | ${1} | ${'2021-07-06'} ${'2020-07-06'} | ${15} | ${'2035-07-06'} + ${'2024-03-02'} | ${1} | ${'2025-03-02'} + ${'2024-03-01'} | ${1} | ${'2025-03-01'} + ${'2024-02-29'} | ${1} | ${'2025-02-28'} + ${'2024-02-28'} | ${1} | ${'2025-02-28'} `( 'returns $expected for "$numberOfYears year(s) after $date"', ({ date, numberOfYears, expected }) => { @@ -805,6 +810,10 @@ describe('date addition/subtraction methods', () => { date | numberOfYears | expected ${'2020-07-06'} | ${4} | ${'2016-07-06'} ${'2020-07-06'} | ${1} | ${'2019-07-06'} + ${'2024-03-02'} | ${1} | ${'2023-03-02'} + ${'2024-03-01'} | ${1} | ${'2023-03-01'} + ${'2024-02-29'} | ${1} | ${'2023-02-28'} + ${'2024-02-28'} | ${1} | ${'2023-02-28'} `( 'returns $expected for "$numberOfYears year(s) before $date"', ({ date, numberOfYears, expected }) => {