[javascript] 생년월일을 YYYYMMDD 형식으로 계산하십시오.

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시간에 의존하지 않기 때문에 아마도 가장 정확할 것입니다.


벤치 마크 : http://jsperf.com/birthday-calculation/15


답변

이 시도.

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/


답변

중요 :이 답변은 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
}