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);
답변
가독성을 원할 것입니다.
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
시간에 의존하지 않기 때문에 아마도 가장 정확할 것입니다.
답변
이 시도.
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
.
답변
중요 :이 답변은 100 % 정확한 답변을 제공하지는 않으며 날짜에 따라 약 10-20 시간 정도 답변이 제공되지 않습니다.
더 나은 해결책은 없습니다 (어쨌든이 답변에는 없음). -나빈
물론 현재 받아 들여진 솔루션보다 더 빠르고 더 짧은 생일 계산기를 만들고자하는 충동에 저항 할 수 없었습니다. 내 솔루션의 주요 요점은 수학이 빠르므로 분기를 사용하는 대신 날짜 모델 javascript가 훌륭한 수학을 사용하여 솔루션을 계산할 수 있다는 것입니다
대답은 다음과 같으며 naveen의 것보다 ~ 65 % 더 빠릅니다.
function calcAge(dateString) {
var birthday = +new Date(dateString);
return ~~((Date.now() - birthday) / (31557600000));
}
매직 번호 : 31557600000은 24 * 3600 * 365.25 * 1000입니다. 이는 1 년의 길이이며, 1 년의 길이는 365 일이고 6 시간은 0.25 일입니다. 결국 i 층은 우리에게 최종 나이를 제공합니다.
벤치 마크는 다음과 같습니다. http://jsperf.com/birthday-calculation
OP의 데이터 형식을 지원하기 위해 교체 할 수 있습니다 +new Date(dateString);
로를+new Date(d.substr(0, 4), d.substr(4, 2)-1, d.substr(6, 2));
더 나은 솔루션을 만들 수 있다면 공유하십시오! 🙂
답변
momentjs로 :
/* The difference, in years, between NOW and 2012-05-07 */
moment().diff(moment('20120507', 'YYYYMMDD'), 'years')
답변
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
나는 각각 3.15576e + 10 밀리 초 (365.25 * 24 * 60 * 60 * 1000) 인 365.25 일 (윤년 때문에 0.25) 년을 사용하고 있습니다.
답변
얼마 전에 나는 그 목적으로 기능을 만들었습니다.
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
답변
내 해결책은 다음과 같습니다. 구문 분석 가능한 날짜를 입력하십시오.
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
}