Как учесть месяцы при получение возраста человека?

console.log(getAge('11.07.2021') )

выводит один

но о факт ж нету еще одного года

function getAge(birthDateString) {
    if (!birthDateString) throw new Error('Invalid date');
    
    const dateInstance = new Date(Date.parse(birthDateString));
    
    return new Date().getFullYear() - dateInstance.getFullYear();
}

console.log(getAge('11.07.2021') )


Ответы (2 шт):

Автор решения: Абдулазиз

function getAge(birthDateString) {
    if (!birthDateString) throw new Error('Invalid date');

    const dateInstance = new Date(Date.parse(birthDateString));

    return ((new Date().getTime() - dateInstance.getTime()) / (30*24*60*60*1000)).toFixed()
    /*
    30 - Дней
    24 - Часов
    60 - Минут
    60 - Сек
    1000 миллСек
    */
    
    /*
      Еще кстати 1 на консоле означает Января
    */
}

console.log(getAge('1.07.2021'))
console.log(getAge('Jan 7 2021'))

→ Ссылка
Автор решения: EzioMercer

Основная суть моего алгоритма в следующем:

  • Вычисляем разницу с сегодняшним днём в миллисекундах
  • Создаём дату на основе этих миллисекунд
  • Дело в том что 0 миллисекунд - это 1970-ый год 1-ый месяц и 1-ый день в JS. Потому нам надо это всё вычесть в конце, чтобы точно узнать разницу в годах, месяцах и днях

Я в этом случае откинул часть с часами т.к. обычно на них не обращают внимания, но при желании можете его включить

Плюс такого подхода в том, что не нужно думать о високосных годах, о том что в каждом месяце ровно 30 дней и другие факторы, которе могут повлиять на тоность вычислений

Сам код:

function getAge(birthDateString) {
  if (!birthDateString) throw new Error('Invalid date');

  const now = new Date();
  now.setMilliseconds(0);
  
  const [nowHours, nowMinutes, nowSeconds] = [now.getHours(), now.getMinutes(), now.getSeconds()].map(num => `${num}`.padStart(2, '0'));
  const [day, month, year] = birthDateString.split('.');
  const birthDate = new Date(`${year}-${month}-${day}T${nowHours}:${nowMinutes}:${nowSeconds}`);
  
  const diff = new Date(now.getTime() - birthDate.getTime());

  const age = diff.toISOString().split('T')[0];
  const [fullYear, fullMonth, fullDay] = age.split('-').map(str => +str);

  return `Age is ${fullYear - 1970} year(s) ${fullMonth - 1} month(s) ${fullDay - 1} day(s)`;
}

console.log(getAge('11.06.2021'));
console.log(getAge('11.07.2021'));

→ Ссылка