Как учесть месяцы при получение возраста человека?
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'));