Имея 2 javascript Dates,
первая дата рождения а вторая - дата для расчета возраста с этой даты.
Каким должен быть лучший способ сделать это.
Имея 2 javascript Dates,
первая дата рождения а вторая - дата для расчета возраста с этой даты.
Каким должен быть лучший способ сделать это.
Вот способ:
function getAge(d1, d2){
d2 = d2 || new Date();
var diff = d2.getTime() - d1.getTime();
return Math.floor(diff / (1000 * 60 * 60 * 24 * 365.25));
}
console.log( getAge(new Date(1978, 10, 3)) );
Будьте осторожны с месяцем. Javascript подсчитывает их от 0. 1978, 10, 3
означает 3 ноября 1978 г.
function calculateAge (birthDate, otherDate) {
birthDate = new Date(birthDate);
otherDate = new Date(otherDate);
var years = (otherDate.getFullYear() - birthDate.getFullYear());
if (otherDate.getMonth() < birthDate.getMonth() ||
otherDate.getMonth() == birthDate.getMonth() && otherDate.getDate() < birthDate.getDate()) {
years--;
}
return years;
}
Пример:
var age = calculateAge("02/24/1991", "02/24/2010"); // Format: MM/DD/YYYY
function getAge(dateString) {
var now = new Date();
var today = new Date(now.getYear(),now.getMonth(),now.getDate());
var yearNow = now.getYear();
var monthNow = now.getMonth();
var dateNow = now.getDate();
var dob = new Date(dateString.substring(6,10),
dateString.substring(0,2)-1,
dateString.substring(3,5)
);
var yearDob = dob.getYear();
var monthDob = dob.getMonth();
var dateDob = dob.getDate();
var age = {};
var ageString = "";
var yearString = "";
var monthString = "";
var dayString = "";
yearAge = yearNow - yearDob;
if (monthNow >= monthDob)
var monthAge = monthNow - monthDob;
else {
yearAge--;
var monthAge = 12 + monthNow -monthDob;
}
if (dateNow >= dateDob)
var dateAge = dateNow - dateDob;
else {
monthAge--;
var dateAge = 31 + dateNow - dateDob;
if (monthAge < 0) {
monthAge = 11;
yearAge--;
}
}
age = {
years: yearAge,
months: monthAge,
days: dateAge
};
if ( age.years > 1 ) yearString = " years";
else yearString = " year";
if ( age.months> 1 ) monthString = " months";
else monthString = " month";
if ( age.days > 1 ) dayString = " days";
else dayString = " day";
if ( (age.years > 0) && (age.months > 0) && (age.days > 0) )
ageString = age.years + yearString + ", " + age.months + monthString + ", and " + age.days + dayString + " old.";
else if ( (age.years == 0) && (age.months == 0) && (age.days > 0) )
ageString = "Only " + age.days + dayString + " old!";
else if ( (age.years > 0) && (age.months == 0) && (age.days == 0) )
ageString = age.years + yearString + " old. Happy Birthday!!";
else if ( (age.years > 0) && (age.months > 0) && (age.days == 0) )
ageString = age.years + yearString + " and " + age.months + monthString + " old.";
else if ( (age.years == 0) && (age.months > 0) && (age.days > 0) )
ageString = age.months + monthString + " and " + age.days + dayString + " old.";
else if ( (age.years > 0) && (age.months == 0) && (age.days > 0) )
ageString = age.years + yearString + " and " + age.days + dayString + " old.";
else if ( (age.years == 0) && (age.months > 0) && (age.days == 0) )
ageString = age.months + monthString + " old.";
else ageString = "Oops! Could not calculate age!";
return ageString;
}
// A bit of jQuery to call the getAge() function and update the page...
$(document).ready(function() {
$("#submitDate").click(function(e) {
e.preventDefault();
$("#age").html(getAge($("input#date").val()));
});
});
and HTML IS
Дата (MM/DD/YYYY): Рассчитать возраст
Возраст: 7 лет, 1 месяц и 15 дней.Преобразовать дату в миллисекунды с эпохи с помощью getTime(), затем вычесть значения и преобразовать результат в годы:
const MS_PER_YEAR = 1000 * 60 * 60 * 24 * 365.2425;
var years = Math.floor((dateNow.getTime() - dateThen.getTime()) / MS_PER_YEARS);
Лучшим способом, вероятно, было бы преобразование даты в метку времени, возможно, используя parse()
, если дата является строкой. Затем просто вычитайте числа и преобразуйте новое число обратно в дату с помощью new Date(milliseconds)
Это может быть не слишком точным для дат до 1/1/1970, хотя, поэтому альтернативный метод вычитания дней, месяцев и т.д. отдельно будет более подходящим.
var birth = new Date('07/11/2003');
var check = new Date();
var milliDay = 1000 * 60 * 60 * 24; // a day in milliseconds;
var ageInDays = (check - birth) / milliDay;
var ageInYears = Math.floor(ageInDays / 365 );
Если вы находитесь в огромном проекте Javascript, вы можете [использовать | нужно использовать] фреймворк...
С Mootools More, у вас есть Тип даты с методом diff и метод timeDiff, который может соответствовать ваши потребности.
Он даже обеспечивает локализацию!
Вот один пример использования библиотеки moment.js, который очень распространен в наши дни. Просто добавьте этот ответ во многие другие ответы.
var banner = $("#banner-message")
var button = $("button")
// handle click and add class
button.on("click", function(){
var inputValue = $("#txtInput").val();
var age = parseInt(moment().diff(inputValue,'years',true));
$("#spantext").html(age + ' years.');
})
body {
background: #20262E;
padding: 20px;
font-family: Helvetica;
}
#banner-message {
background: #fff;
border-radius: 4px;
padding: 20px;
text-align: center;
transition: all 0.2s;
margin: 0 auto;
width: 300px;
}
button {
background: #0084ff;
border: none;
border-radius: 5px;
padding: 8px 14px;
font-size: 15px;
color: #fff;
}
#banner-message.alt {
background: #0084ff;
color: #fff;
margin-top: 40px;
width: 200px;
}
#banner-message.alt button {
background: #fff;
color: #000;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="banner-message">
<p>Enter Date: <input type='text' id='txtInput' value='1981-12-25' /></p>
<label>Age is : </label><span id='spantext'></span> <br/>
<p><button>Calculate Age</button></p>
</div>
Я изменил ответ Mic, чтобы сегодня был день рождения пользователя. Разница заключается в том, что дата, когда вы проверяете возраст, должна быть установлена в полночь того дня и/или текущая дата должна быть установлена в 23:59:59. Примером может быть то, будет ли пользователь 18 сегодня, это вернет 18.
function getAge(d1){
var now = new Date();
var d2 = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 23, 59, 59);
var diff = d2.getTime() - d1.getTime();
return Math.floor(diff / (1000 * 60 * 60 * 24 * 365.25));
}
console.log(getAge(new Date(1992, 10, 17, 0, 0, 0)));
function getAge(dateOfBirth, tillDate) {
var dob = new Date(dateOfBirth);
var endDt = new Date(tillDate) || new Date();
return new Date(endDt.getTime() - dob.getTime()).getUTCFullYear() - 1970;
}
Пример: console.log(getAge('1/1/2000', '1/1/2016')); // Format: MM/DD/YYYY
Получить возрастный калькулятор по текущему году
calculateExp(birthDate) {
birthDate = new Date(birthDate);
var now = new Date();
otherDate = new Date(now.getFullYear(),now.getMonth(),now.getDate());
var years = (otherDate.getFullYear() - birthDate.getFullYear() );
if (otherDate.getMonth() < birthDate.getMonth() || otherDate.getMonth() == birthDate.getMonth() && otherDate.getDate() < birthDate.getDate()) {
years--;
}
return years;
}
Этот сценарий использования сценария високосного года также:
const getAgeFromBirthDate = (year, month, day) => {
const date = new Date();
date.setFullYear(date.getFullYear() - year);
date.setMonth(date.getMonth() - month);
//date.setDate(date.getDate() - day);
return date;
};
console.log( getAgeFromBirthDate(1994, 07, 19).getFullYear() );