Вот функция, которая сделает это за вас:
const pluralize = (str, n) => n > 1 ? `${n} ${str.concat('s')}` : n == 0 ? '' :`${n} ${str}`
const calcAge = (dob) => {
const age = moment.duration(moment().diff(moment(dob)))
const ageInYears = Math.floor(age.asYears())
const ageInMonths = Math.floor(age.asMonths())
const ageInDays = Math.floor(age.asDays())
if (age < 0)
throw 'DOB is in the future!'
let pluralYears = pluralize('year', ageInYears)
let pluralDays = pluralize('day', age.days())
if (ageInYears < 18) {
if (ageInYears >= 1) {
return `${pluralYears} ${pluralize('month', age.months())}`
} else if (ageInYears < 1 && ageInMonths >= 1) {
return `${pluralize('month', ageInMonths)} ${pluralDays}`
} else {
return pluralDays
}
} else {
return pluralYears
}
}
console.log(calcAge('2000-01-01')) // 18 Years
console.log(calcAge('2011-05-01')) // 7 years 5 months
console.log(calcAge('2015-10-01')) // 3 years
console.log(calcAge('2017-05-01')) // 1 year 5 months
console.log(calcAge('2018-09-01')) // 1 month 5 days
console.log(calcAge('2018-10-01')) // 6 days
console.log(calcAge('2018-07-07')) // 3 months
console.log(calcAge('2099-12-01')) // Uncaught DOB is in the future!
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
Он основан на моменте, и главное, он использует moment.diff в moment.duration .С этого момента он просто получает правильные части этой продолжительности в правильных form
(то есть годах / месяцах / днях).
Я не проводил обширных испытаний, поэтому не стесняйтесь возиться и посмотреть, не справится ли он с некоторыми случаями на 100%.