Рассчитайте возраст с помощью momentJS и получите разные выходные строки - PullRequest
0 голосов
/ 06 октября 2018

Вот как я вычисляю возраст человека через момент:

const age = moment().diff('1980-01-01', 'years', false)

Но так как мне также нужно узнать текущий возраст детей и младенцев, мне нужно получить результат, подобный этомучетыре примера:

30 years          // adults
1 year 2 months   // for all <18 years
2 months 12 days  // for all <1 year and > 1 month
20 days           // for all <1 month

Как рассчитать эти выходные данные?

1 Ответ

0 голосов
/ 07 октября 2018

Вот функция, которая сделает это за вас:

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%.

...