js считает +1 год в дни рождения

116
28 октября 2019, 00:50

Неправильно считает день рождения. т,е если сегодня 26 февраля 2019, а др стоит где-нибудь 10.10.2019., то он показывает 25 лет.

    if(userInfo && userInfo.birthDay){ 
            let date = new Date(HexToSignedInt(userInfo.birthDay)); 
            let optionsTime = { 
                year: 'numeric', 
                month: '2-digit', 
                day: '2-digit' 
            }; 
            birthDay = date.toLocaleString('en-GB', optionsTime).replace(',', ' '); 
            // years = this.calculateAge(date.getFullYear(), date.getUTCMonth() + 1, date.getUTCDate()); 
            years = this.calculateAge(date.getFullYear(), date.getMonth(), date.getDate()); 
        } 
     
     
     
    calculateAge(year, month, day) { 
        let currentDate = new Date(); 
        let currentYear = currentDate.getFullYear(); 
        let currentMonth = currentDate.getMonth(); 
        let currentDay = currentDate.getDate(); 
        // You need to treat the cases where the year, month or day hasn't arrived yet. 
        let age = currentYear - year; 
        // if (currentMonth < month) { 
        if (currentDate < month) { 
            return age; 
        } else { 
            if (currentDay >= day) { 
                return age; 
            } else { 
                age--; 
                return age; 
            } 
        } 
    }

Answer 1

Логика сравнения должна быть простой:

  1. Если текущий месяц меньше месяца в дате рождения - возраст равен разнице годов -1
  2. в противном случае,
    1. если текущий день меньше дня в дате рождения - возраст равен разнице годов-1
    2. иначе разнице годов

Пример в числах:

Дата рождения: 2000-02-10

  1. Сегодня 2019-02-09, т.е. за день до:

    1. разница годов 2019-2000 = 19
    2. текущий месяц совпадает
    3. текущий день меньше дня в дате рождения, результат 19-1 = 18.
  2. Сегодня 2019-02-10, т.е. день рождения сегодня

    1. разница годов 2019-2000 = 19
    2. текущий месяц совпадает
    3. текущий день не меньше дня в дате рождения, результат 19.
  3. Сегодня 2019-02-11, т.е. день после

    1. разница годов 2019-2000 = 19
    2. текущий месяц совпадает
    3. текущий день не меньше дня в дате рождения, результат 19.
  4. Сегодня 2019-01-09, т.е. на месяц раньше

    1. разница годов 2019-2000 = 19
    2. текущий месяц меньше - результат 19-1 = 18

Пример:

function calculateAge(year, month, day) { 
  let currentDate = new Date(); 
  let currentYear = currentDate.getFullYear(); 
  let currentMonth = currentDate.getMonth(); 
  let currentDay = currentDate.getDate(); 
  console.log(currentYear, currentMonth, currentDay); 
  console.log(year, month, day); 
  // You need to treat the cases where the year, month or day hasn't arrived yet. 
  let age = currentYear - year; 
  if (currentMonth < month) { 
    return age - 1; 
  } 
  return currentDay < day ? age - 1 : age; 
} 
 
console.log(calculateAge(2000, 1, 10)); 
console.log(calculateAge(2000, 1, 26)); 
console.log(calculateAge(2000, 1, 27)); 
console.log(calculateAge(2000, 2, 10));

Answer 2

@Oleksey зачем такие сложности?

const currentDate = new Date()
const birthDate = new Date('1994-10-10');
const MILLISECONDS_IN_YEAR = 31536000000;
const age = Math.floor((currentDate - birthDate ) / MILLISECONDS_IN_YEAR);
console.log(`Возраст: ${age}`);
Не учел високосные годы =(

или используя momentJS

const age = moment().diff(moment('1994-10-10'), 'year')
READ ALSO
Задержка в each

Задержка в each

как сделать задержку на переход к следующему элементу и событие submit? есть формы у товара с разными размерами

112
Slider Range ввод в поле

Slider Range ввод в поле

подскажите как обработать ввод в инпуты и чтобы ползунок менял значение

111