2016-02-18 2 views
1
function getAge(dateString1,dateString2) { 
    var today = new Date(dateString2); 
    var birthDate = new Date(dateString1); 
    var age = today.getFullYear() - birthDate.getFullYear(); 
    var m = today.getMonth() - birthDate.getMonth(); 
    if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) { 
     age--; 
    } 
    return age; 
} 

Я знаю, что это какая-то загадка, но я знаю, что эта функция производит ошибочные результаты, но не уверена, когда это будет? DateString - std. объект даты в JavaScript.Возраст не вычисляется правильно?

Input On which it produced faulty results 
DateString1 
1988-04-05 00:00:00 
1965-05-06 00:00:00 
1971-03-14 00:00:00 
1975-11-10 00:00:00 
1981-10-21 00:00:00 
1974-06-01 00:00:00 
1988-08-11 00:00:00 

DateString2 
2016-03-31 00:00:00 

После оценки возраст никогда не должен прийти> = 65, но для этих значений это было не так.

+0

В каком случае это ошибка? Все они? Что делает эта строка> = 65 с кодом? – epascarello

+0

да все они. Ну в основном я проходил эти 2 даты и возраст должен был быть менее 65 всегда. Но для этих случаев расчетный возраст был либо> или = до 65 –

+1

Когда я запускаю ваш код, ни один из этих случаев не возвращает возраст> = 65. – Jorrex

ответ

1

Если вы хотите, чтобы просто отобразить возраст, как исполнившихся лет, это хороший хак для делать это:

function getAgeInFullYears(birthdate, today) { 
    // These two lines are not necessary if function is called with proper Date objects 
    birthdate = new Date(birthdate); 
    today = new Date(today); 

    birthdate = birthdate.getFullYear() * 10000 + 
       birthdate.getMonth() * 100 + 
       birthdate.getDate(); 

    today = today.getFullYear() * 10000 + 
      today.getMonth() * 100 + 
      today.getDate(); 

    return Math.floor((today - birthdate)/10000); 
} 

Он работает путем «преобразования» относится к десятичных чисел в виде ггггммдд, как 19,740,427 на 27 апреля 1974 года. Затем он вычитает дату рождения с текущей даты, делит результат на 10000 и пропускает остаток.

Используемые множители 100 и 10000 на самом деле довольно произвольны, и любые факторы работают до тех пор, пока коэффициент месяца> = 31, а коэффициент года = = (12 * месячный фактор).

Вызов getAgeInFullYears('1988-04-05', '2016-02-18') возвращает 27, например.

Смежные вопросы