Как рассчитать возраст в годах, учитывая дату рождения в формате ГГГГММДД? Возможно ли использовать 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);
javascript
date
Франциск
источник
источник
Date
должен был бы сделать объект, если бы он его инкапсулировал. Люди могли писать книги о непристойности обращения с JSDate
. ... Если вы можете жить с тем, что иногда уезжаете на один день, то приближение:AgeInYears = Math.floor ( (now_Date - DOB_Date) / 31556952000 )
примерно настолько просто, насколько вы можете получить.Ответы:
Я бы пошел на удобочитаемость:
Отказ от ответственности: это также имеет проблемы с точностью, поэтому этому нельзя полностью доверять. Он может быть отключен на несколько часов, в некоторые годы или в летнее время (в зависимости от часового пояса).
Вместо этого я бы рекомендовал использовать для этого библиотеку, если точность очень важна. Кроме того
@Naveens post
, это, вероятно, самый точный, поскольку он не зависит от времени суток.Тесты: http://jsperf.com/birthday-calculation/15
источник
Попробуй это.
Я считаю, что единственное, что выглядело грубым в вашем коде, это
substr
частьСкрипка : http://jsfiddle.net/codeandcloud/n33RJ/
источник
Важно: Этот ответ не дает 100% точного ответа, он выключен примерно на 10-20 часов в зависимости от даты.
Я, конечно, не мог устоять перед желанием принять вызов и сделать более быстрый и короткий калькулятор дня рождения, чем текущее принятое решение. Главное в моем решении - математика быстрая, поэтому вместо использования ветвления, а javascript модели даты предоставляет для расчета решения, мы используем замечательную математику.
Ответ выглядит примерно так и работает на 65% быстрее, чем у Навина, плюс он намного короче:
Магическое число: 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
формат, который я дал в вопросе, он потерпит неудачу.С моментами:
источник
Чистый однострочный раствор с использованием ES6:
Я использую год из 365,25 дней (0,25 из-за високосных годов), что составляет 3,15576e + 10 миллисекунд (365,25 * 24 * 60 * 60 * 1000) соответственно.
источник
const yearInMs = 3.15576e+10 // Using a year of 365.25 days (because leap years)
Некоторое время назад я сделал функцию с этой целью:
Он принимает объект Date в качестве входных данных, поэтому вам нужно проанализировать
'YYYYMMDD'
форматированную строку даты:источник
birthDate
есть 5 января 1980 , и текущая дата 4 января 2005 , то функция будет ошибочно сообщать ,age
как 25 ... Правильное значение составляет 24Вот мое решение, просто передайте разбираемую дату:
источник
Альтернативное решение, потому что почему бы и нет:
источник
источник
Чтобы проверить, прошел ли день рождения или нет, я определяю вспомогательную функцию
Date.prototype.getDoY
, которая эффективно возвращает номер дня года. Остальное довольно очевидно.источник
Я думаю, что это может быть просто так:
Работает также с отметкой времени
источник
Я просто должен был написать эту функцию для себя - принятый ответ довольно хорош, но IMO может использовать некоторую очистку. Это требует метки времени Unix для dob, потому что это было моим требованием, но его можно быстро адаптировать для использования строки:
Обратите внимание, что я использовал плоское значение 31 в моей функции measureDays. Все вычисления заботятся о том, чтобы «день года» был монотонно возрастающим показателем отметки времени.
Если вы используете метку времени или строку javascript, очевидно, вы захотите удалить коэффициент 1000.
источник
Чтобы узнать возраст, когда была введена европейская дата:
источник
Еще одно возможное решение с moment.js :
источник
Я проверил примеры, показанные ранее, и они работали не во всех случаях, и поэтому я сделал собственный сценарий. Я проверил это, и он отлично работает.
источник
Это самый элегантный способ для меня:
источник
Получить возраст (годы, месяцы и дни) с даты рождения с помощью JavaScript
Функция calcularEdad (годы, месяцы и дни)
Функция esNumero
источник
Идеально для меня работает, ребята.
источник
Я знаю, что это очень старая тема, но я хотел добавить эту реализацию, которую я написал, чтобы найти возраст, который, как мне кажется, гораздо точнее.
Конечно, вы можете адаптировать это, чтобы соответствовать другим форматам получения параметров. Надеюсь, это поможет кому-то найти лучшее решение.
источник
Я использовал этот подход, используя логику вместо математики. Это точно и быстро. Параметры - это год, месяц и день рождения человека. Возвращает возраст человека как целое число.
источник
Принятие сообщений от naveen и оригинального OP привело к тому, что у меня появилась заглушка для метода многократного использования, которая принимает как строки, так и / или объекты JS Date.
Я назвал его,
gregorianAge()
потому что этот расчет дает именно то, как мы обозначаем возраст, используя григорианский календарь. т.е. не считая год окончания, если месяц и день предшествуют месяцу и дню года рождения.источник
Еще два варианта:
источник
Я сделал некоторые обновленные до одного предыдущего ответа.
Надеюсь, это поможет: D
источник
Вот простой способ расчета возраста:
источник
источник
Вы можете использовать это для ограничения возраста в вашей форме -
источник
Я немного опоздал, но я нашел, что это самый простой способ вычислить дату рождения.
HTML-тег:
Надеюсь, это поможет.
источник
Вот самое простое, самое точное решение, которое я мог придумать:
А вот пример, который будет рассматривать 29 февраля -> 28 февраля в год.
Это даже работает с отрицательным возрастом!
источник
Еще одно решение:
источник
С помощью метода « 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";
В качестве прототипа
}
источник