Обчисліть вік за датою народження у форматі РРРРММДД


285

Як я можу обчислити вік у роках, враховуючи дату народження формату YYYYMMDD? Чи можливо за допомогою 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
@Francisc, він сирий, але це те, що Dateоб'єкт мав би зробити, якби його інкапсулював. Люди могли писати книги про вдачу роботи JS Date. ... Якщо ти можеш жити, коли іноді не буваєш день, тоді наближення: AgeInYears = Math.floor ( (now_Date - DOB_Date) / 31556952000 )приблизно так просто, як ти можеш отримати.
Брок Адамс

Відповіді:


245

Я хотів би зрозуміти:

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 для читабельності та швидкості.
Крістофер Дорф

506

Спробуйте це.

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частина.

Fiddle : 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/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: Я ніколи не говорив, що я або відповідь була загально правильною (TM). Я включив поняття контекстів / юрисдикцій / поглядів. Обидва мої коментарі явно включають в себе великі букви IF (до звернення з leaplings виключення). Насправді в моєму першому коментарі було сказано саме те, що я мав намір сказати, і ніколи не було включено жодне судження щодо правильного чи неправильного. Насправді мої коментарі пояснюють, чого і чого не слід чекати (і чому) від цієї відповіді (як ви її називаєте "висвітлити проблеми"). Пс: 31 лютого?!?
GitaarLAB

72

Важливо: Ця відповідь не дає 100% точної відповіді, її вимикають приблизно на 10-20 годин, залежно від дати.

Немає кращих рішень (не в цих відповідях все одно). - naveen

Я, звичайно, не міг протистояти прагненню прийняти виклик і зробити більш швидкий і коротший калькулятор дня народження, ніж прийняте рішення. Основним моментом для мого рішення є те, що математика швидка, тому замість того, щоб використовувати розгалуження, і 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- розрахунок

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

Якщо ви можете придумати краще рішення, будь ласка, поділіться! :-)


Це досить круте рішення. Єдина проблема, яку я бачу з цим, - це dateStringаргумент просто бути правильним для конструктора Date (), щоб правильно його розібрати. Наприклад, прийнявши YYYYMMDDформат, який я дав у запитанні, це не вдасться.
Франциск

22
У цій відповіді є помилка. Встановіть годинник на 12:01. О 12:01 ранку, якщо ви calcAge ('2012-03-27') (сьогоднішня дата), ви отримаєте відповідь нуля, хоча вона повинна дорівнювати 1. Ця помилка існує протягом усієї години 12:00. Це пов’язано з неправильним твердженням, що рік має в ньому 365,25 днів. Це не. Ми маємо справу з календарними роками, а не тривалістю орбіти Землі (що точніше 365,256363 дні). Рік має 365 днів, крім високосного року, який має 366 днів. Крім того, виступ на щось подібне безглуздий. Технічне обслуговування набагато важливіше.
Ерік Брандель

1
Дякуємо за ваше рішення, Крістоффер. Чи можу я запитати, що робить + new порівняно із лише новим, а також двома тильдами (~) у відповідь?
Френк Йенсен

1
@FrankJensen Привіт Франк, мені теж було цікаво, і я знайшов цю відповідь: подвійний перехід перетворює пливу на цілі привітання
Стано

1
@FrankJensen по суті, тильда перетворює число (двійкове значення), перетворюючи float в ціле число (floored), отже, два тильди дають вам округлене число. + Перед новою датою () перетворює об'єкт у ціле представлення об'єкта дати, це також можна використовувати з рядками чисел, наприклад + '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,15576е + 10 мілісекунд (365,25 * 24 * 60 * 60 * 1000) відповідно.


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

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 Чому це? У мене зараз ця проблема. Дякую.
Jack H

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

CMS Привіт :-) Я написав це запитання ( stackoverflow.com/questions/16435981/… ), і мені сказали, що якщо я хочу 100% точну відповідь, я повинен перевіряти кожен рік - якщо це високосний рік, а потім прорахувати останній фракція. (див. відповідь Гуффи). Ваша функція (її частина) робить це . але як я можу використовувати це для визначення віку на 100% точно? DOB рідко починається з 1/1 / yyyy ..... так як я можу використовувати ваш 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 дня. EG: для DoB = 2001/07/04 ця функція повернеться через 7 років, на 2008/07/03 .
Брок Адамс

@Brock: Дякую Якщо я не помиляюся, я виправив цю помилкову поведінку.
Марсель Корпель

Так, я думаю, що ви, можливо, не пройшли тестування, просто проаналізували). Але зауважте, що нове рішення не є більш простим і не елегантнішим, ніж рішення ОП (не рахуючи, що це належним чином закріплено у функції). ... Рішення ОП легше зрозуміти (таким чином перевірити, протестувати або змінити). Іноді найкраще просто і зрозуміло, ІМО.
Брок Адамс

@Brock: Я повністю згоден: я повинен думати про те, що ця функція робить, і це ніколи не є корисною справою.
Марсель Корпель

Чи не повинен "якщо (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 у своїй функції "вимірювання". Все, що хвилює розрахунок, полягає в тому, щоб "день року" був монотонно зростаючим показником часової позначки.

Якщо ви використовуєте часову позначку або рядок javascript, очевидно, ви хочете зняти коефіцієнт 1000.


n не визначено. Я думаю, ти маєш на увазі зараз.getFullYear ()
Ларрі Битва

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

Функція калькуляторEdad (роки, місяці та дні)

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;
            }
        }
    }

рядки або об'єкти дати для введення відповідно до ОП
nazim

0

Приймаючи з навіених та оригінальних постів ОП, я закінчив за допомогою заглушки методу багаторазового використання, яка приймає як рядки, так і / або об'єкти дати JS.

Я назвав його, 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

З методом momentjs "fromNow" Це дозволяє вам працювати з відформатованою датою, тобто: 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.