Рассчитать возраст с учетом даты рождения в формате ГГГГММДД


285

Как рассчитать возраст в годах, учитывая дату рождения в формате ГГГГММДД? Возможно ли использовать Date()функцию?

Я ищу лучшее решение, чем то, которое я использую сейчас:

var dob = '19800810';
var year = Number(dob.substr(0, 4));
var month = Number(dob.substr(4, 2)) - 1;
var day = Number(dob.substr(6, 2));
var today = new Date();
var age = today.getFullYear() - year;
if (today.getMonth() < month || (today.getMonth() == month && today.getDate() < day)) {
  age--;
}
alert(age);


Пожалуйста, следите за форматированием, не делайте так, как вы; просто сделайте отступ в вашем коде с 4 пробелами, используя кнопку кода (010101) или Ctrl-K.
Марсель Корпель

Я сделал, но он не работает на IE9 Beta, поэтому я должен был сделать это вручную.
Франциск

4
Ваше оригинальное решение лучше при расчете возраста, чем текущие ответы. Ответ Хулио Сантоса по сути тот же. Другие ответы дают неточные результаты при многих условиях и могут быть менее простыми или менее эффективными.
Брок Адамс

Спасибо, Брок. Я надеялся, что есть более элегантный способ сделать это, чем тот, который кажется немного грубым.
Франциск

4
@ Франциск, это грубо, но это то, что Dateдолжен был бы сделать объект, если бы он его инкапсулировал. Люди могли писать книги о непристойности обращения с JS Date. ... Если вы можете жить с тем, что иногда уезжаете на один день, то приближение: AgeInYears = Math.floor ( (now_Date - DOB_Date) / 31556952000 )примерно настолько просто, насколько вы можете получить.
Брок Адамс

Ответы:


246

Я бы пошел на удобочитаемость:

function _calculateAge(birthday) { // birthday is a date
    var ageDifMs = Date.now() - birthday.getTime();
    var ageDate = new Date(ageDifMs); // miliseconds from epoch
    return Math.abs(ageDate.getUTCFullYear() - 1970);
}

Отказ от ответственности: это также имеет проблемы с точностью, поэтому этому нельзя полностью доверять. Он может быть отключен на несколько часов, в некоторые годы или в летнее время (в зависимости от часового пояса).

Вместо этого я бы рекомендовал использовать для этого библиотеку, если точность очень важна. Кроме того @Naveens post, это, вероятно, самый точный, поскольку он не зависит от времени суток.


Тесты: http://jsperf.com/birthday-calculation/15


3
Возвращает 0 лет для дат с 2000-02-29 по 2001-02-28, когда, вероятно, должно вернуться 1.
RobG

16
@RobG Не думаю, что с 2000-02-29 по 2001-02-28 технически прошел целый год, поэтому ваш ответ недействителен. Это не имеет смысла, с 2000-02-28 по 2001-02-28 год, поэтому с 2000-02-29 по 2001-02-28 должно быть меньше года.
Андре Снед Кок

3
Вы не уточнили, что означает «не точный», я подумал, что может быть полезна дополнительная информация Возможно, вы решите исправить проблемы или удалить ответ.
RobG

1
@RobG На самом деле я сделал. Я также указал на лучшее решение, чем мое собственное. Мое решение решает проблему легко читаемым способом, с незначительными проблемами точности, но в пределах своей цели.
Андре Снеде Коцк

1
Прекрасный ответ @ AndréSnedeHansen и быстрый тоже, так как у вас нет такого сумасшедшего разделения, как в моем ответе ;-) +1 за удобочитаемость и скорость.
Кристоффер Дорф

507

Попробуй это.

function getAge(dateString) {
    var today = new Date();
    var birthDate = new Date(dateString);
    var age = today.getFullYear() - birthDate.getFullYear();
    var m = today.getMonth() - birthDate.getMonth();
    if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {
        age--;
    }
    return age;
}

Я считаю, что единственное, что выглядело грубым в вашем коде, это substrчасть

Скрипка : http://jsfiddle.net/codeandcloud/n33RJ/


Можете ли вы привести пример использования? Я не мог заставить его работать без изменения функции, чтобы она принимала 3 отдельных аргумента, таких как: getAge (y, m, d). Например: jsbin.com/ehaqiw/1/edit
edt

Как и многие другие, он считает, что с 2000-02-29 по 2001-02-28 - это ноль лет, когда он, скорее всего, должен быть 1 (поскольку до 2001-03-01 должно быть 1 год 1 день).
RobG

3
@RobG: когда скачки «празднуют» (общий ответ на этот вопрос на самом деле кажется «выходными, ближайшими к фактической дате»), их день рождения различается в зависимости от контекста, включая географический регион (простой английский: где вы живете ), ЗАКОН (не стоит недооценивать это), религия и личные предпочтения (включая групповое поведение): некоторые причины: «я родился в феврале», другие причины: «я родился на следующий день после 28 февраля» (чаще всего это 1 марта) en.wikipedia.org/wiki/Feb February_29 Для всего вышеперечисленного этот алгоритм верен, ЕСЛИ 1 марта - результат високосного года, который нужен
GitaarLAB

3
@RobG: выгребная яма «плюс x месяц (ы)» не имеет отношения к человеческому представлению о возрасте в годах. Общепринятое человеческое представление состоит в том, что возраст (InYears) -счет увеличивается с каждым днем ​​(независимо от времени), когда в календаре один и тот же месяц и день (по сравнению с начальной датой): так, что с 2000-02-28 по 2001-02 -27 = 0 лет и с 2000-02-28 по 2001-02-28 = 1 год. Распространение этого «здравого смысла» на скачков: 2000-02-29 (день после 2000-02-28) до 2001-02-28 = ноль лет . В моем комментарии просто говорилось, что отвеченный алгоритм всегда дает «правильный» человеческий ответ, ЕСЛИ кто-то ожидает / соглашается с этой логикой для скачков.
GitaarLAB

3
@RobG: я никогда не говорил, что я или ответ был универсально правильным (ТМ). Я включил понятие контекстов / юрисдикций / взглядов. Оба моих комментария явно включают IF в верхнем регистре (для обработки скачков исключений). Фактически, в моем первом комментарии было сказано именно то, что я хотел сказать, и никогда не было никаких суждений относительно правильности или неправильности. По сути, мои комментарии проясняют, чего и чего не следует ожидать (и почему) от этого ответа (как вы это называете «выделить проблемы»). Ps: 31 февраля?!?
GitaarLAB

72

Важно: Этот ответ не дает 100% точного ответа, он выключен примерно на 10-20 часов в зависимости от даты.

Лучших решений нет (во всяком случае, не в этих ответах). - Навин

Я, конечно, не мог устоять перед желанием принять вызов и сделать более быстрый и короткий калькулятор дня рождения, чем текущее принятое решение. Главное в моем решении - математика быстрая, поэтому вместо использования ветвления, а javascript модели даты предоставляет для расчета решения, мы используем замечательную математику.

Ответ выглядит примерно так и работает на 65% быстрее, чем у Навина, плюс он намного короче:

function calcAge(dateString) {
  var birthday = +new Date(dateString);
  return ~~((Date.now() - birthday) / (31557600000));
}

Магическое число: 31557600000 - это 24 * 3600 * 365.25 * 1000. Это длина года, длина года составляет 365 дней и 6 часов, что составляет 0,25 дня. В конце я получаю пол, который дает нам окончательный возраст.

Вот критерии: http://jsperf.com/birthday-calculation

Для поддержки формата данных OP вы можете заменить +new Date(dateString);
на+new Date(d.substr(0, 4), d.substr(4, 2)-1, d.substr(6, 2));

Если вы можете найти лучшее решение, пожалуйста, поделитесь! :-)


Это довольно крутое решение. Единственная проблема, которую я вижу с этим dateStringаргументом, состоит в том, что конструктор Date () просто правильно его проанализирует. Например, принимая YYYYMMDDформат, который я дал в вопросе, он потерпит неудачу.
Франциск

22
В этом ответе есть ошибка. Установите ваши часы на 0:01 утра. В 12:01, если вы вычислите ('2012-03-27') (сегодняшняя дата), вы получите нулевой ответ, даже если он равен 1. Эта ошибка существует в течение всего 12:00 часов. Это связано с неверным утверждением, что в году 365,25 дней. Это не. Мы имеем дело с календарными годами, а не с длиной орбиты Земли (точнее 365,256363 дня). В году 365 дней, кроме високосного года, в котором 366 дней. Кроме того, выступление на чем-то подобном не имеет смысла. Ремонтопригодность гораздо важнее.
Эрик Брандель,

1
Спасибо за ваше решение Кристоффер. Могу ли я спросить, что + новый делает по сравнению с новым, а также две тильды (~) в ответ?
Фрэнк Дженсен

1
@FrankJensen Привет, Фрэнк, мне тоже было любопытно, и я нашел ответ: двойная тильда преобразует число с плавающей точкой в ​​целочисленные приветствия
Стано

1
@FrankJensen, по существу, тильда инвертирует число (двоичное значение) при преобразовании числа с плавающей точкой в ​​целое число (с полами), следовательно, две тильды дают округленное число. Знак + перед новой функцией Date () преобразует объект в целочисленное представление объекта даты, это также можно использовать со строками чисел, например + '21 '=== 21
Кристоффер Дорф

55

С моментами:

/* The difference, in years, between NOW and 2012-05-07 */
moment().diff(moment('20120507', 'YYYYMMDD'), 'years')

2
@RicardoPontual это требует моментов, поэтому не может быть лучшим ответом.
itzmukeshy7

13
@ itzmukeshy7 действительно, для того, чтобы ответ был лучшим, он должен по крайней мере требовать jQuery;)
thomaux

@thomaux Это полностью зависит от среды разработки!
itzmukeshy7

@ itzmukeshy7 расслабься, это шутка;) см .: meta.stackexchange.com/a/19492/173875
thomaux

2
@thomaux Я знал, что это шутка;)
itzmukeshy7

38

Чистый однострочный раствор с использованием ES6:

const getAge = birthDate => Math.floor((new Date() - new Date(birthDate).getTime()) / 3.15576e+10)

// today is 2018-06-13
getAge('1994-06-14') // 23
getAge('1994-06-13') // 24

Я использую год из 365,25 дней (0,25 из-за високосных годов), что составляет 3,15576e + 10 миллисекунд (365,25 * 24 * 60 * 60 * 1000) соответственно.


1
Довольно чертовски аккуратно - не могли бы вы пояснить, что означает 3.15576e + 10?
Леоне

1
Да, было бы хорошо добавить следующую строку перед функцией:const yearInMs = 3.15576e+10 // Using a year of 365.25 days (because leap years)
Лукас Янон

12

Некоторое время назад я сделал функцию с этой целью:

function getAge(birthDate) {
  var now = new Date();

  function isLeap(year) {
    return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
  }

  // days since the birthdate    
  var days = Math.floor((now.getTime() - birthDate.getTime())/1000/60/60/24);
  var age = 0;
  // iterate the years
  for (var y = birthDate.getFullYear(); y <= now.getFullYear(); y++){
    var daysInYear = isLeap(y) ? 366 : 365;
    if (days >= daysInYear){
      days -= daysInYear;
      age++;
      // increment the age only if there are available enough days for the year.
    }
  }
  return age;
}

Он принимает объект Date в качестве входных данных, поэтому вам нужно проанализировать 'YYYYMMDD'форматированную строку даты:

var birthDateStr = '19840831',
    parts = birthDateStr.match(/(\d{4})(\d{2})(\d{2})/),
    dateObj = new Date(parts[1], parts[2]-1, parts[3]); // months 0-based!

getAge(dateObj); // 26

Ах да, я пропустил високосный год. Спасибо.
Франциск

1
Это дает недопустимые значения для выбранных комбинаций дат! Например, если birthDateесть 5 января 1980 , и текущая дата 4 января 2005 , то функция будет ошибочно сообщать , ageкак 25 ... Правильное значение составляет 24
Брок Адамс

@BrockAdams Почему это? У меня эта проблема в данный момент. Спасибо.
Джек Х

@VisionIncision, потому что он не обрабатывает граничные условия должным образом. Хотите верьте, хотите нет, но код из вопроса - лучший подход - хотя, похоже, один из более поздних ответов мог бы переупаковать его более подходящим образом.
Брок Адамс

Привет CMS :-) Я написал этот вопрос ( stackoverflow.com/questions/16435981/… ), и мне сказали, что если я хочу получить 100% точный ответ, я должен проверять каждый год - если это високосный год, а затем рассчитать последний доля. (см. ответ Гуффы). Ваша функция (часть этого) делает это . но как я могу использовать его, чтобы рассчитать возраст на 100%? DOB редко начинается с 1/1 / гггг ..... так как я могу использовать ваш func для вычисления точного возраста?
Ройи Намир

10

Вот мое решение, просто передайте разбираемую дату:

function getAge(birth) {
  ageMS = Date.parse(Date()) - Date.parse(birth);
  age = new Date();
  age.setTime(ageMS);
  ageYear = age.getFullYear() - 1970;

  return ageYear;

  // ageMonth = age.getMonth(); // Accurate calculation of the month part of the age
  // ageDay = age.getDate();    // Approximate calculation of the day part of the age
}

7

Альтернативное решение, потому что почему бы и нет:

function calculateAgeInYears (date) {
    var now = new Date();
    var current_year = now.getFullYear();
    var year_diff = current_year - date.getFullYear();
    var birthday_this_year = new Date(current_year, date.getMonth(), date.getDate());
    var has_had_birthday_this_year = (now >= birthday_this_year);

    return has_had_birthday_this_year
        ? year_diff
        : year_diff - 1;
}

5
function age()
{
    var birthdate = $j('#birthDate').val(); // in   "mm/dd/yyyy" format
    var senddate = $j('#expireDate').val(); // in   "mm/dd/yyyy" format
    var x = birthdate.split("/");    
    var y = senddate.split("/");
    var bdays = x[1];
    var bmonths = x[0];
    var byear = x[2];
    //alert(bdays);
    var sdays = y[1];
    var smonths = y[0];
    var syear = y[2];
    //alert(sdays);

    if(sdays < bdays)
    {
        sdays = parseInt(sdays) + 30;
        smonths = parseInt(smonths) - 1;
        //alert(sdays);
        var fdays = sdays - bdays;
        //alert(fdays);
    }
    else{
        var fdays = sdays - bdays;
    }

    if(smonths < bmonths)
    {
        smonths = parseInt(smonths) + 12;
        syear = syear - 1;
        var fmonths = smonths - bmonths;
    }
    else
    {
        var fmonths = smonths - bmonths;
    }

    var fyear = syear - byear;
    document.getElementById('patientAge').value = fyear+' years '+fmonths+' months '+fdays+' days';
}

Спасибо, легко найти возраст в годах, месяцах и днях
Сумит Кумар Гупта

5

Чтобы проверить, прошел ли день рождения или нет, я определяю вспомогательную функцию Date.prototype.getDoY, которая эффективно возвращает номер дня года. Остальное довольно очевидно.

Date.prototype.getDoY = function() {
    var onejan = new Date(this.getFullYear(), 0, 1);
    return Math.floor(((this - onejan) / 86400000) + 1);
};

function getAge(birthDate) {
    function isLeap(year) {
        return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
    }

    var now = new Date(),
        age = now.getFullYear() - birthDate.getFullYear(),
        doyNow = now.getDoY(),
        doyBirth = birthDate.getDoY();

    // normalize day-of-year in leap years
    if (isLeap(now.getFullYear()) && doyNow > 58 && doyBirth > 59)
        doyNow--;

    if (isLeap(birthDate.getFullYear()) && doyNow > 58 && doyBirth > 59)
        doyBirth--;

    if (doyNow <= doyBirth)
        age--;  // birthday not yet passed this year, so -1

    return age;
};

var myBirth = new Date(2001, 6, 4);
console.log(getAge(myBirth));

Это дает неточные результаты в високосные годы, в дни рождения после 28 февраля. Такие люди стареют на 1 день. Например : для DoB = 2001/07/04 эта функция вернет 7 лет, 2008/07/03 .
Брок Адамс

@ Брок: Спасибо. Если я не ошибаюсь, я исправил это ошибочное поведение.
Марсель Корпель

Да, я думаю, что вы могли бы (не тщательно тестировать, просто проанализировали). Но обратите внимание, что новое решение не проще и не более элегантно, чем решение OP (не считая того, что оно правильно инкапсулировано в функцию). ... Решение ОП легче понять (таким образом, провести аудит, протестировать или изменить). Иногда проще и понятнее, ИМО.
Брок Адамс

@ Брок: Я полностью согласен: я должен подумать о том, что делает эта функция, и это никогда не бывает хорошо.
Марсель Корпель

Не должно ли "if (doyNow <doyBirth)" быть "if (doyNow <= doyBirth)"? Во всех моих тестах день был выходным, и это исправило это.
Тед Кулп

5

Я думаю, что это может быть просто так:

function age(dateString){
    let birth = new Date(dateString);
    let now = new Date();
    let beforeBirth = ((() => {birth.setDate(now.getDate());birth.setMonth(now.getMonth()); return birth.getTime()})() < birth.getTime()) ? 0 : 1;
    return now.getFullYear() - birth.getFullYear() - beforeBirth;
}

age('09/20/1981');
//35

Работает также с отметкой времени

age(403501000000)
//34

Этот код будет рассчитывать человека, имеющего одинаковый возраст в течение всего года. В вашем примере, если бы сегодня было '09 / 19/2018 ', код дал бы 37, но возраст (за день до дня рождения) был бы 36 ...
Стив Гооссенс

4

Я просто должен был написать эту функцию для себя - принятый ответ довольно хорош, но IMO может использовать некоторую очистку. Это требует метки времени Unix для dob, потому что это было моим требованием, но его можно быстро адаптировать для использования строки:

var getAge = function(dob) {
    var measureDays = function(dateObj) {
            return 31*dateObj.getMonth()+dateObj.getDate();
        },
        d = new Date(dob*1000),
        now = new Date();

    return now.getFullYear() - d.getFullYear() - (measureDays(now) < measureDays(d));
}

Обратите внимание, что я использовал плоское значение 31 в моей функции measureDays. Все вычисления заботятся о том, чтобы «день года» был монотонно возрастающим показателем отметки времени.

Если вы используете метку времени или строку javascript, очевидно, вы захотите удалить коэффициент 1000.


п не определено. Я думаю, что вы имеете в виду сейчас. GetFullYear ()
Larry Battle

4
function getAge(dateString) {

    var dates = dateString.split("-");
    var d = new Date();

    var userday = dates[0];
    var usermonth = dates[1];
    var useryear = dates[2];

    var curday = d.getDate();
    var curmonth = d.getMonth()+1;
    var curyear = d.getFullYear();

    var age = curyear - useryear;

    if((curmonth < usermonth) || ( (curmonth == usermonth) && curday < userday   )){

        age--;

    }

    return age;
}

Чтобы узнать возраст, когда была введена европейская дата:

getAge('16-03-1989')

Спасибо за ваше предложение на stackoverflow.com/a/13367162/1055987 хороший улов.
JFK

3

Еще одно возможное решение с moment.js :

var moment = require('moment');
var startDate = new Date();
var endDate = new Date();
endDate.setDate(endDate.getFullYear() + 5); // Add 5 years to second date
console.log(moment.duration(endDate - startDate).years()); // This should returns 5

2

Я проверил примеры, показанные ранее, и они работали не во всех случаях, и поэтому я сделал собственный сценарий. Я проверил это, и он отлично работает.

function getAge(birth) {
   var today = new Date();
   var curr_date = today.getDate();
   var curr_month = today.getMonth() + 1;
   var curr_year = today.getFullYear();

   var pieces = birth.split('/');
   var birth_date = pieces[0];
   var birth_month = pieces[1];
   var birth_year = pieces[2];

   if (curr_month == birth_month && curr_date >= birth_date) return parseInt(curr_year-birth_year);
   if (curr_month == birth_month && curr_date < birth_date) return parseInt(curr_year-birth_year-1);
   if (curr_month > birth_month) return parseInt(curr_year-birth_year);
   if (curr_month < birth_month) return parseInt(curr_year-birth_year-1);
}

var age = getAge('18/01/2011');
alert(age);

Должен ли 2000-02-29 к 2001-02-28 быть один год? Если так, то вышеупомянутое не идеально. :-)
RobG

2

Это самый элегантный способ для меня:

const getAge = (birthDateString) => {
  const today = new Date();
  const birthDate = new Date(birthDateString);

  const yearsDifference = today.getFullYear() - birthDate.getFullYear();

  if (
    today.getMonth() < birthDate.getMonth() ||
    (today.getMonth() === birthDate.getMonth() && today.getDate() < birthDate.getDate())
  ) {
    return yearsDifference - 1;
  }

  return yearsDifference;
};

console.log(getAge('2018-03-12'));


1

Получить возраст (годы, месяцы и дни) с даты рождения с помощью JavaScript

Функция calcularEdad (годы, месяцы и дни)

function calcularEdad(fecha) {
        // Si la fecha es correcta, calculamos la edad

        if (typeof fecha != "string" && fecha && esNumero(fecha.getTime())) {
            fecha = formatDate(fecha, "yyyy-MM-dd");
        }

        var values = fecha.split("-");
        var dia = values[2];
        var mes = values[1];
        var ano = values[0];

        // cogemos los valores actuales
        var fecha_hoy = new Date();
        var ahora_ano = fecha_hoy.getYear();
        var ahora_mes = fecha_hoy.getMonth() + 1;
        var ahora_dia = fecha_hoy.getDate();

        // realizamos el calculo
        var edad = (ahora_ano + 1900) - ano;
        if (ahora_mes < mes) {
            edad--;
        }
        if ((mes == ahora_mes) && (ahora_dia < dia)) {
            edad--;
        }
        if (edad > 1900) {
            edad -= 1900;
        }

        // calculamos los meses
        var meses = 0;

        if (ahora_mes > mes && dia > ahora_dia)
            meses = ahora_mes - mes - 1;
        else if (ahora_mes > mes)
            meses = ahora_mes - mes
        if (ahora_mes < mes && dia < ahora_dia)
            meses = 12 - (mes - ahora_mes);
        else if (ahora_mes < mes)
            meses = 12 - (mes - ahora_mes + 1);
        if (ahora_mes == mes && dia > ahora_dia)
            meses = 11;

        // calculamos los dias
        var dias = 0;
        if (ahora_dia > dia)
            dias = ahora_dia - dia;
        if (ahora_dia < dia) {
            ultimoDiaMes = new Date(ahora_ano, ahora_mes - 1, 0);
            dias = ultimoDiaMes.getDate() - (dia - ahora_dia);
        }

        return edad + " años, " + meses + " meses y " + dias + " días";
    }

Функция esNumero

function esNumero(strNumber) {
    if (strNumber == null) return false;
    if (strNumber == undefined) return false;
    if (typeof strNumber === "number" && !isNaN(strNumber)) return true;
    if (strNumber == "") return false;
    if (strNumber === "") return false;
    var psInt, psFloat;
    psInt = parseInt(strNumber);
    psFloat = parseFloat(strNumber);
    return !isNaN(strNumber) && !isNaN(psFloat);
}


0

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

var getAge = function(year,month,date){
    var today = new Date();
    var dob = new Date();
    dob.setFullYear(year);
    dob.setMonth(month-1);
    dob.setDate(date);
    var timeDiff = today.valueOf() - dob.valueOf();
    var milliInDay = 24*60*60*1000;
    var noOfDays = timeDiff / milliInDay;
    var daysInYear = 365.242;
    return  ( noOfDays / daysInYear ) ;
}

Конечно, вы можете адаптировать это, чтобы соответствовать другим форматам получения параметров. Надеюсь, это поможет кому-то найти лучшее решение.


0

Я использовал этот подход, используя логику вместо математики. Это точно и быстро. Параметры - это год, месяц и день рождения человека. Возвращает возраст человека как целое число.

function calculateAge(year, month, day) {
        var currentDate = new Date();
        var currentYear = currentDate.getFullYear();
        var currentMonth = currentDate.getUTCMonth() + 1;
        var currentDay = currentDate.getUTCDate();
        // You need to treat the cases where the year, month or day hasn't arrived yet.
        var age = currentYear - year;
        if (currentMonth > month) {
            return age;
        } else {
            if (currentDay >= day) {
                return age;
            } else {
                age--;
                return age;
            }
        }
    }

строки или объекты даты для ввода согласно OP
nazim

0

Принятие сообщений от naveen и оригинального OP привело к тому, что у меня появилась заглушка для метода многократного использования, которая принимает как строки, так и / или объекты JS Date.

Я назвал его, gregorianAge()потому что этот расчет дает именно то, как мы обозначаем возраст, используя григорианский календарь. т.е. не считая год окончания, если месяц и день предшествуют месяцу и дню года рождения.

/**
 * Calculates human age in years given a birth day. Optionally ageAtDate
 * can be provided to calculate age at a specific date
 *
 * @param string|Date Object birthDate
 * @param string|Date Object ageAtDate optional
 * @returns integer Age between birthday and a given date or today
 */
function gregorianAge(birthDate, ageAtDate) {
  // convert birthDate to date object if already not
  if (Object.prototype.toString.call(birthDate) !== '[object Date]')
    birthDate = new Date(birthDate);

  // use today's date if ageAtDate is not provided
  if (typeof ageAtDate == "undefined")
    ageAtDate = new Date();

  // convert ageAtDate to date object if already not
  else if (Object.prototype.toString.call(ageAtDate) !== '[object Date]')
    ageAtDate = new Date(ageAtDate);

  // if conversion to date object fails return null
  if (ageAtDate == null || birthDate == null)
    return null;


  var _m = ageAtDate.getMonth() - birthDate.getMonth();

  // answer: ageAt year minus birth year less one (1) if month and day of
  // ageAt year is before month and day of birth year
  return (ageAtDate.getFullYear()) - birthDate.getFullYear() 
  - ((_m < 0 || (_m === 0 && ageAtDate.getDate() < birthDate.getDate())) ? 1 : 0)
}

// Below is for the attached snippet

function showAge() {
  $('#age').text(gregorianAge($('#dob').val()))
}

$(function() {
  $(".datepicker").datepicker();
  showAge();
});
<link rel="stylesheet" href="//code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
<script src="//code.jquery.com/jquery-1.10.2.js"></script>
<script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script>

DOB:
<input name="dob" value="12/31/1970" id="dob" class="datepicker" onChange="showAge()" /> AGE: <span id="age"><span>


0

Еще два варианта:

// Int Age to Date as string YYY-mm-dd
function age_to_date(age)
{
    try {
        var d = new Date();
        var new_d = '';
        d.setFullYear(d.getFullYear() - Math.abs(age));
        new_d = d.getFullYear() + '-' + d.getMonth() + '-' + d.getDate();

        return new_d;
    } catch(err) {
        console.log(err.message);
    }
}
// Date string (YYY-mm-dd) to Int age (years old)
function date_to_age(date)
{
    try {
        var today = new Date();
        var d = new Date(date);

        var year = today.getFullYear() - d.getFullYear();
        var month = today.getMonth() - d.getMonth();
        var day = today.getDate() - d.getDate();
        var carry = 0;

        if (year < 0)
            return 0;
        if (month <= 0 && day <= 0)
            carry -= 1;

        var age = parseInt(year);
        age += carry;

        return Math.abs(age);
    } catch(err) {
        console.log(err.message);
    }
}

0

Я сделал некоторые обновленные до одного предыдущего ответа.

var calculateAge = function(dob) {
    var days = function(date) {
            return 31*date.getMonth() + date.getDate();
        },
        d = new Date(dob*1000),
        now = new Date();

    return now.getFullYear() - d.getFullYear() - ( measureDays(now) < measureDays(d));
}

Надеюсь, это поможет: D


0

Вот простой способ расчета возраста:

//dob date dd/mm/yy 
var d = 01/01/1990


//today
//date today string format 
var today = new Date(); // i.e wed 04 may 2016 15:12:09 GMT
//todays year
var todayYear = today.getFullYear();
// today month
var todayMonth = today.getMonth();
//today date
var todayDate = today.getDate();

//dob
//dob parsed as date format   
var dob = new Date(d);
// dob year
var dobYear = dob.getFullYear();
// dob month
var dobMonth = dob.getMonth();
//dob date
var dobDate = dob.getDate();

var yearsDiff = todayYear - dobYear ;
var age;

if ( todayMonth < dobMonth ) 
 { 
  age = yearsDiff - 1; 
 }
else if ( todayMonth > dobMonth ) 
 {
  age = yearsDiff ; 
 }

else //if today month = dob month
 { if ( todayDate < dobDate ) 
  {
   age = yearsDiff - 1;
  }
    else 
    {
     age = yearsDiff;
    }
 }

0
var now = DateTime.Now;
var age = DateTime.Now.Year - dob.Year;
if (now.Month < dob.Month || now.Month == dob.Month && now.Day < dob.Day) age--;

Это делает простое различие года между теперь и годом рождения. Затем он вычитает год, если сегодня день раньше, чем день рождения (подумайте об этом, ваш возраст повышается в течение года, в день вашего рождения)
Стив Гооссенс

0

Вы можете использовать это для ограничения возраста в вашей форме -

function dobvalidator(birthDateString){
    strs = birthDateString.split("-");
    var dd = strs[0];
    var mm = strs[1];
    var yy = strs[2];

    var d = new Date();
    var ds = d.getDate();
    var ms = d.getMonth();
    var ys = d.getFullYear();
    var accepted_age = 18;

    var days = ((accepted_age * 12) * 30) + (ms * 30) + ds;
    var age = (((ys - yy) * 12) * 30) + ((12 - mm) * 30) + parseInt(30 - dd);

    if((days - age) <= '0'){
        console.log((days - age));
        alert('You are at-least ' + accepted_age);
    }else{
        console.log((days - age));
        alert('You are not at-least ' + accepted_age);
    }
}

0

Я немного опоздал, но я нашел, что это самый простой способ вычислить дату рождения.

$(document).ready(init);

function init()
{
  writeYears("myage", 0, Age());
  $(".captcha").click(function()
  {
    reloadCaptcha();
  });

}

function Age()
{
    var birthday = new Date(1997, 02, 01),  //Year, month, day.
        today = new Date(),
        one_year = 1000*60*60*24*365;
    return Math.floor( (today.getTime() - birthday.getTime() ) / one_year);
}

function writeYears(id, current, maximum)
{
  document.getElementById(id).innerHTML = current;

  if (current < maximum)
  {
    setTimeout( function() { writeYears(id, ++current, maximum); }, Math.sin( current/maximum ) * 200 );
    }
}

HTML-тег:

<span id="myage"></span>

Надеюсь, это поможет.


-1

Вот самое простое, самое точное решение, которое я мог придумать:

Date.prototype.getAge = function (date) {
    if (!date) date = new Date();
    return ~~((date.getFullYear() + date.getMonth() / 100
    + date.getDate() / 10000) - (this.getFullYear() + 
    this.getMonth() / 100 + this.getDate() / 10000));
}

А вот пример, который будет рассматривать 29 февраля -> 28 февраля в год.

Date.prototype.getAge = function (date) {
    if (!date) date = new Date();
    var feb = (date.getMonth() == 1 || this.getMonth() == 1);
    return ~~((date.getFullYear() + date.getMonth() / 100 + 
        (feb && date.getDate() == 29 ? 28 : date.getDate())
        / 10000) - (this.getFullYear() + this.getMonth() / 100 + 
        (feb && this.getDate() == 29 ? 28 : this.getDate()) 
        / 10000));
}

Это даже работает с отрицательным возрастом!


Как и все остальные, он считает, что с 2000-02-29 по 2001-02-28 - ноль лет.
RobG

Я обновил свой ответ, чтобы учесть случай с високосным годом. Спасибо @RobG
Wizulus

-1

Еще одно решение:

/**
 * Calculate age by birth date.
 *
 * @param int birthYear Year as YYYY.
 * @param int birthMonth Month as number from 1 to 12.
 * @param int birthDay Day as number from 1 to 31.
 * @return int
 */
function getAge(birthYear, birthMonth, birthDay) {
  var today = new Date();
  var birthDate = new Date(birthYear, birthMonth-1, birthDay);
  var age = today.getFullYear() - birthDate.getFullYear();
  var m = today.getMonth() - birthDate.getMonth();
  if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {
    age--;
  }
  return age;
}

-1

С помощью метода « fromNow » momentjs это позволяет работать с форматированной датой, т. Е. 15.03.1968.

var dob = document.getElementByID("dob"); var age = moment(dob.value).fromNow(true).replace(" years", "");

//fromNow(true) => suffix "ago" is not displayed //but we still have to get rid of "years";

В качестве прототипа

String.prototype.getAge = function() {
return moment(this.valueOf()).fromNow(true).replace(" years", "");

}

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.