Java에서 다른 사람의 나이를 어떻게 계산합니까?


147

Java 메소드에서 int로 몇 년을 반환하고 싶습니다. 내가 지금 가지고있는 것은 getBirthDate ()가 Date 객체 (생년월일 ;-)를 반환하는 위치입니다.

public int getAge() {
    long ageInMillis = new Date().getTime() - getBirthDate().getTime();

    Date age = new Date(ageInMillis);

    return age.getYear();
}

그러나 getYear ()가 더 이상 사용되지 않으므로 더 좋은 방법이 있는지 궁금합니다. 단위 테스트가 아직 (아직) 없기 때문에 이것이 올바르게 작동하는지조차 확실하지 않습니다.


그것에 대해 내 마음을 바꿨다 : 다른 질문은 정확한 나이가 아니라 날짜 사이의 대략적인 연도 만있다.
cletus

그가 int를 반환한다고 가정하면 '올바른'시대가 무엇을 의미하는지 명확히 할 수 있습니까?
Brian Agnew

2
Date vs Calendar는 Java 문서를 읽을 때 얻을 수있는 기본 개념입니다. 이것이 왜 그렇게 많이 찬성 될지 이해할 수 없습니다.
demongolem

@demongolem ??? 날짜와 달력을 쉽게 이해할 수 있습니까?! 아뇨, 전혀 아닙니다. 스택 오버플로에 대한 주제에 대한 질문이 있습니다. Joda-Time 프로젝트는 가장 번거로운 날짜-시간 수업을 대체하기 위해 가장 인기있는 라이브러리 중 하나를 제작했습니다. 나중에 Sun, Oracle 및 JCP 커뮤니티는 JSR 310 ( java.time )을 수락하여 레거시 클래스가 절망적 이지 않다는 것을 인정했습니다. 자세한 정보는 Tutorial by Oracle을 참조하십시오 .
Basil Bourque

답변:


159

JDK 8은 이것을 쉽고 우아하게 만듭니다.

public class AgeCalculator {

    public static int calculateAge(LocalDate birthDate, LocalDate currentDate) {
        if ((birthDate != null) && (currentDate != null)) {
            return Period.between(birthDate, currentDate).getYears();
        } else {
            return 0;
        }
    }
}

사용법을 보여주는 JUnit 테스트 :

public class AgeCalculatorTest {

    @Test
    public void testCalculateAge_Success() {
        // setup
        LocalDate birthDate = LocalDate.of(1961, 5, 17);
        // exercise
        int actual = AgeCalculator.calculateAge(birthDate, LocalDate.of(2016, 7, 12));
        // assert
        Assert.assertEquals(55, actual);
    }
}

지금은 모두 JDK 8을 사용해야합니다. 모든 이전 버전은 지원 기간이 끝났습니다.


10
DAY_OF_YEAR 비교는 윤년을 다룰 때 잘못된 결과를 초래할 수 있습니다.
sinuhepop

1
dateOfBirth 변수는 Date 객체 여야합니다. 생년월일이있는 Date 객체를 어떻게 만들 수 있습니까?
Erick

우리가 9 년이 지났고 Java 8이 사용되는 경우를 고려할 때 이것이 솔루션이되어야합니다.
nojevive

JDK 9는 현재 프로덕션 버전입니다. 그 어느 때보 다 진실입니다.
duffymo

2
@SteveOh 동의하지 않습니다. 오히려 nulls를 전혀 받아들이지 않고 대신을 사용 Objects.requireNonNull합니다.
MC 황제

170

날짜 / 시간 계산을 간소화 하는 Joda를 확인하십시오 (Joda는 새로운 표준 Java 날짜 / 시간 API의 기초이므로 곧 표준 API를 배우게됩니다).

편집 : Java 8은 매우 유사 하며 체크 아웃 할 가치가 있습니다.

예 :

LocalDate birthdate = new LocalDate (1970, 1, 20);
LocalDate now = new LocalDate();
Years age = Years.yearsBetween(birthdate, now);

원하는만큼 간단합니다. Java 8 이전의 것들은 (직접 알았 듯이) 다소 직관적이지 않습니다.


2
@ HoàngLong : JavaDocs에서 : "이 클래스는 하루를 나타내는 것이 아니라 자정에 밀리 초를 나타냅니다. 하루 종일을 나타내는 클래스가 필요한 경우 Interval 또는 LocalDate가 더 적합 할 수 있습니다." 우리가 정말 않습니다 여기에 날짜를 표현하고 싶다.
Jon Skeet

@JohnSkeet이 제안한 방식으로 수행하려면 다음과 같습니다. Years age = Years.yearsBetween (new LocalDate (getBirthDate ()), new LocalDate ());
Fletch

DateMidnight을 사용 했는지 모르겠으며 이제는 더 이상 사용되지 않습니다. 이제 LOCALDATE 사용하도록 변경
브라이언 애그뉴

2
@Bor-joda-time.sourceforge.net/ apidocs
Brian Agnew

2
@IgorGanapolsky 실제로 가장 큰 차이점은 Joda-Time은 생성자를 사용하고 Java-8 및 ThreetenBP는 정적 팩토리 메소드를 사용한다는 것입니다. Joda-Time이 연령을 계산하는 방식의 미묘한 버그에 대해서는 다른 라이브러리의 동작에 대한 개요를 제공 한 답변을 참조하십시오 .
Meno Hochschild 9

43
Calendar now = Calendar.getInstance();
Calendar dob = Calendar.getInstance();
dob.setTime(...);
if (dob.after(now)) {
  throw new IllegalArgumentException("Can't be born in the future");
}
int year1 = now.get(Calendar.YEAR);
int year2 = dob.get(Calendar.YEAR);
int age = year1 - year2;
int month1 = now.get(Calendar.MONTH);
int month2 = dob.get(Calendar.MONTH);
if (month2 > month1) {
  age--;
} else if (month1 == month2) {
  int day1 = now.get(Calendar.DAY_OF_MONTH);
  int day2 = dob.get(Calendar.DAY_OF_MONTH);
  if (day2 > day1) {
    age--;
  }
}
// age is now correct

예, 달력 수업은 끔찍합니다. 불행히도 직장에서 때로는 사용해야합니다 : /. 이것을 게시 해 주셔서 감사합니다 Cletus
Steve

1
Calendar.DAY_OF_YEAR와 Calendar.MONTH 및 Calendar.DAY_OF_MONTH를 교체하고 적어도 약간 청소기 될 것입니다
Tobbbe

@Tobbbe 윤년에 3 월 1 일에 태어났다면, 생일은 다음 해 3 월 1 일이며 2 년이 아닙니다. DAY_OF_YEAR이 작동하지 않습니다.
Airsource Ltd

42

최신 답변 및 개요

a) Java-8 (java.time-package)

LocalDate start = LocalDate.of(1996, 2, 29);
LocalDate end = LocalDate.of(2014, 2, 28); // use for age-calculation: LocalDate.now()
long years = ChronoUnit.YEARS.between(start, end);
System.out.println(years); // 17

이 표현식 LocalDate.now()은 시스템 시간대 (암시 적으로 사용자가 간과하는)와 관련이 있습니다. 명확성을 위해 일반적으로 now(ZoneId.of("Europe/Paris"))명시 적 시간대 (여기서는 "유럽 / 파리")를 지정 하여 오버로드 된 방법을 사용하는 것이 좋습니다 . 시스템 시간대가 요청되면 개인적으로 LocalDate.now(ZoneId.systemDefault())시스템 시간대와의 관계를 명확하게 작성 하는 것이 좋습니다. 이것은 더 많은 노력을 기울이지 만 읽기는 더 쉽습니다.

b) 요다 타임

제안되고 수용된 Joda-Time-solution은 위에 표시된 날짜 (드문 경우)에 대해 다른 계산 결과를 산출합니다.

LocalDate birthdate = new LocalDate(1996, 2, 29);
LocalDate now = new LocalDate(2014, 2, 28); // test, in real world without args
Years age = Years.yearsBetween(birthdate, now);
System.out.println(age.getYears()); // 18

나는 이것을 작은 버그로 생각하지만 Joda 팀은이 이상한 행동에 대해 다른 견해를 가지고 있으며 그것을 고치고 싶지 않습니다 (종료일이 시작 날짜보다 작기 때문에 연도는 하나 덜). 이 닫힌 문제 도 참조하십시오 .

c) java.util.Calendar 등

비교를 위해 다양한 다른 답변을 참조하십시오. 결과 코드가 이국적인 경우에는 오류가 발생하기 쉽고 원래 질문이 너무 간단하다는 사실을 고려하면 너무 복잡하기 때문에이 오래된 클래스를 전혀 사용하지 않는 것이 좋습니다. 2015 년에는 더 나은 도서관이 있습니다.

d) Date4J 소개 :

제안 된 솔루션은 간단하지만 윤년이되면 실패 할 수 있습니다. 일의 평가만으로는 신뢰할 수 없습니다.

e) 내 라이브러리 Time4J :

이것은 Java-8 솔루션과 유사하게 작동합니다. 그냥 교체 LocalDatePlainDateChronoUnit.YEARS에 의해 CalendarUnit.YEARS. 그러나 "오늘"을 얻으려면 명시적인 시간대 참조가 필요합니다.

PlainDate start = PlainDate.of(1996, 2, 29);
PlainDate end = PlainDate.of(2014, 2, 28);
// use for age-calculation (today): 
// => end = SystemClock.inZonalView(EUROPE.PARIS).today();
// or in system timezone: end = SystemClock.inLocalView().today();
long years = CalendarUnit.YEARS.between(start, end);
System.out.println(years); // 17

1
Java 8 버전에 감사드립니다! 시간을 절약했습니다 :) 이제 남은 달을 추출하는 방법을 알아 내야합니다. 예 : 1 년 1 개월 :)
thomas77

2
@ thomas77 답장을 보내 주셔서 감사합니다. Java-8에서`java.time.Period '를 사용하여 몇 년, 몇 달, 몇 일을 합칠 수 있습니다. 시간과 같은 다른 단위를 고려하고 싶다면 Java-8은 솔루션을 제공하지 않습니다.
Meno Hochschild

다시 한 번 감사드립니다 (빠른 답변) :)
thomas77

1
사용할 때 시간대를 지정하는 것이 좋습니다 LocalDate.now. 생략하면 JVM의 현재 기본 시간대가 내재적으로 적용됩니다. 이 기본값은 시스템 / OS / 설정간에 변경 될 수 있으며 런타임 중에 코드 호출을 통해 언제든지 변경할 수 있습니다 setDefault. 다음과 같이 구체적으로 추천합니다.LocalDate.now( ZoneId.for( "America/Montreal" ) )
Basil Bourque

1
@GoCrafter_LP 예, Java-8을 시뮬레이션하는 ThreetenABP 또는 Joda-Time-Android (D. Lew) 또는 내 구형 Time4A를 이전 Android 버전에 적용 할 수 있습니다.
Meno Hochschild 2016 년

17
/**
 * This Method is unit tested properly for very different cases , 
 * taking care of Leap Year days difference in a year, 
 * and date cases month and Year boundary cases (12/31/1980, 01/01/1980 etc)
**/

public static int getAge(Date dateOfBirth) {

    Calendar today = Calendar.getInstance();
    Calendar birthDate = Calendar.getInstance();

    int age = 0;

    birthDate.setTime(dateOfBirth);
    if (birthDate.after(today)) {
        throw new IllegalArgumentException("Can't be born in the future");
    }

    age = today.get(Calendar.YEAR) - birthDate.get(Calendar.YEAR);

    // If birth date is greater than todays date (after 2 days adjustment of leap year) then decrement age one year   
    if ( (birthDate.get(Calendar.DAY_OF_YEAR) - today.get(Calendar.DAY_OF_YEAR) > 3) ||
            (birthDate.get(Calendar.MONTH) > today.get(Calendar.MONTH ))){
        age--;

     // If birth date and todays date are of same month and birth day of month is greater than todays day of month then decrement age
    }else if ((birthDate.get(Calendar.MONTH) == today.get(Calendar.MONTH )) &&
              (birthDate.get(Calendar.DAY_OF_MONTH) > today.get(Calendar.DAY_OF_MONTH ))){
        age--;
    }

    return age;
}

2
수표의 목적은 무엇입니까 (birthDate.get(Calendar.DAY_OF_YEAR) - today.get(Calendar.DAY_OF_YEAR) > 3)? 월과 dayofmonth 비교의 존재로 무의미 해 보입니다.
Jed Schaaf

13

나는 단순히 일 년 상수 값으로 밀리 초를 사용하여 이점을 얻습니다.

Date now = new Date();
long timeBetween = now.getTime() - age.getTime();
double yearsBetween = timeBetween / 3.15576e+10;
int age = (int) Math.floor(yearsBetween);

2
이것은 정확한 답변이 아닙니다 ... 연도는 3.156e + 10이 아니라 3.15576e + 10 (분기 일!)
Maher Abuthraa

1
이것은 몇 년이되지 작업 윤년하고 다른 밀리 초 값이 있나요
그렉 에니스

12

GWT를 사용하는 경우 java.util.Date 사용으로 제한됩니다. 날짜를 정수로 사용하지만 java.util.Date를 사용하는 메소드는 다음과 같습니다.

public int getAge(int year, int month, int day) {
    Date now = new Date();
    int nowMonth = now.getMonth()+1;
    int nowYear = now.getYear()+1900;
    int result = nowYear - year;

    if (month > nowMonth) {
        result--;
    }
    else if (month == nowMonth) {
        int nowDay = now.getDate();

        if (day > nowDay) {
            result--;
        }
    }
    return result;
}

5

JodaTime을 사용하는 정답 은 다음과 같습니다.

public int getAge() {
    Years years = Years.yearsBetween(new LocalDate(getBirthDate()), new LocalDate());
    return years.getYears();
}

원하는 경우 한 줄로 줄일 수도 있습니다. BrianAgnew의 답변 에서 아이디어를 복사 했지만 의견에서 볼 때 더 정확하다고 생각합니다 (그리고 질문에 정확하게 대답합니다).


4

date4j의 라이브러리 :

int age = today.getYear() - birthdate.getYear();
if(today.getDayOfYear() < birthdate.getDayOfYear()){
  age = age - 1; 
}

4

이것은 나이가 'int'가 되길 원한다는 것을 고려할 때 위의 것의 향상된 버전입니다. 때로는 많은 라이브러리로 프로그램을 채우고 싶지 않기 때문입니다.

public int getAge(Date dateOfBirth) {
    int age = 0;
    Calendar born = Calendar.getInstance();
    Calendar now = Calendar.getInstance();
    if(dateOfBirth!= null) {
        now.setTime(new Date());
        born.setTime(dateOfBirth);  
        if(born.after(now)) {
            throw new IllegalArgumentException("Can't be born in the future");
        }
        age = now.get(Calendar.YEAR) - born.get(Calendar.YEAR);             
        if(now.get(Calendar.DAY_OF_YEAR) < born.get(Calendar.DAY_OF_YEAR))  {
            age-=1;
        }
    }  
    return age;
}

4

일 년에 몇 일 또는 몇 달이 있는지 또는 그 달에 몇 일이 있는지 알 필요가 없으며, 윤년, 윤초 또는 기타에 대해 알 필요가 없습니다. 이 간단한 100 % 정확한 방법을 사용하여

public static int age(Date birthday, Date date) {
    DateFormat formatter = new SimpleDateFormat("yyyyMMdd");
    int d1 = Integer.parseInt(formatter.format(birthday));
    int d2 = Integer.parseInt(formatter.format(date));
    int age = (d2-d1)/10000;
    return age;
}

Java 6 및 5에 대한 솔루션을 찾고 있습니다. 이것은 간단하지만 정확합니다.
Jj Tuibeo

3

이 코드를 코드에 복사 한 다음 방법을 사용하여 나이를 얻으십시오.

public static int getAge(Date birthday)
{
    GregorianCalendar today = new GregorianCalendar();
    GregorianCalendar bday = new GregorianCalendar();
    GregorianCalendar bdayThisYear = new GregorianCalendar();

    bday.setTime(birthday);
    bdayThisYear.setTime(birthday);
    bdayThisYear.set(Calendar.YEAR, today.get(Calendar.YEAR));

    int age = today.get(Calendar.YEAR) - bday.get(Calendar.YEAR);

    if(today.getTimeInMillis() < bdayThisYear.getTimeInMillis())
        age--;

    return age;
}

코드 전용 답변은 권장하지 않습니다. 이 코드가 OP 질문을 해결할 수있는 이유를 설명하는 것이 좋습니다.
рüффп

실제로 더 똑똑하지는 않지만 .. 문제를 해결하기 위해 업데이트 될 것입니다.
Kevin

3

나는 나이 계산을 위해이 코드를 사용한다. 이것이 도움이되기를 바란다.

private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());

public static int calculateAge(String date) {

    int age = 0;
    try {
        Date date1 = dateFormat.parse(date);
        Calendar now = Calendar.getInstance();
        Calendar dob = Calendar.getInstance();
        dob.setTime(date1);
        if (dob.after(now)) {
            throw new IllegalArgumentException("Can't be born in the future");
        }
        int year1 = now.get(Calendar.YEAR);
        int year2 = dob.get(Calendar.YEAR);
        age = year1 - year2;
        int month1 = now.get(Calendar.MONTH);
        int month2 = dob.get(Calendar.MONTH);
        if (month2 > month1) {
            age--;
        } else if (month1 == month2) {
            int day1 = now.get(Calendar.DAY_OF_MONTH);
            int day2 = dob.get(Calendar.DAY_OF_MONTH);
            if (day2 > day1) {
                age--;
            }
        }
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return age ;
}

2

필드 생성 및 효과는 모두 날짜 필드입니다.

Calendar bir = Calendar.getInstance();
bir.setTime(birth);
int birthNm = bir.get(Calendar.DAY_OF_YEAR);
int birthYear = bir.get(Calendar.YEAR);
Calendar eff = Calendar.getInstance();
eff.setTime(effect);

이것은 기본적으로 감가 상각 된 방법을 사용하지 않고 John O의 솔루션을 수정합니다. 코드에서 코드를 작동시키기 위해 상당한 시간을 보냈습니다. 어쩌면 이것이 다른 사람들을 구할 수도 있습니다.


2
좀 더 잘 설명해 주시겠습니까? 나이는 어떻게 계산합니까?
Jonathan S. Fisher

1

이건 어때?

public Integer calculateAge(Date date) {
    if (date == null) {
        return null;
    }
    Calendar cal1 = Calendar.getInstance();
    cal1.setTime(date);
    Calendar cal2 = Calendar.getInstance();
    int i = 0;
    while (cal1.before(cal2)) {
        cal1.add(Calendar.YEAR, 1);
        i += 1;
    }
    return i;
}

이것은 정말 귀여운 제안입니다 (Joda를 사용하지 않고 Java 8을 사용할 수없는 경우)하지만 첫해 전체가 지날 때까지 0이기 때문에 알고리즘이 약간 잘못되었습니다. 따라서 while 루프를 시작하기 전에 날짜에 1 년을 추가해야합니다.
Dagmar

1

String dateofbirth생년월일이 있습니다. 형식은 무엇이든 (다음 줄에 정의되어 있음) :

org.joda.time.format.DateTimeFormatter formatter =  org.joda.time.format.DateTimeFormat.forPattern("mm/dd/yyyy");

형식을 지정하는 방법은 다음과 같습니다.

org.joda.time.DateTime birthdateDate = formatter.parseDateTime(dateofbirth );
org.joda.time.DateMidnight birthdate = new         org.joda.time.DateMidnight(birthdateDate.getYear(), birthdateDate.getMonthOfYear(), birthdateDate.getDayOfMonth() );
org.joda.time.DateTime now = new org.joda.time.DateTime();
org.joda.time.Years age = org.joda.time.Years.yearsBetween(birthdate, now);
java.lang.String ageStr = java.lang.String.valueOf (age.getYears());

변수 ageStr에는 몇 년이 있습니다.


1

Yaron Ronen 솔루션의 우아하고 겉으로는 정확한 타임 스탬프 차이 기반 변형입니다.

나는 그것이 왜 정확하지 않은지를 증명하기 위해 단위 테스트를 포함하고 있습니다. 타임 스탬프 차이에서 다른 윤일 수 (및 초)로 인해 불가능할 수 있습니다. 불일치는이 알고리즘에 대해 최대 +1 일 (1 초)이어야합니다. test2 ()를 참조하십시오. 반면 Yaron Ronen 솔루션 timeDiff / MILLI_SECONDS_YEAR은 40 일 이전에는 10 일이 다를 수 있다고 가정 하지만이 변형도 올바르지 않습니다.

formula를 사용하는이 향상된 변형 diffAsCalendar.get(Calendar.YEAR) - 1970은 대부분의 날짜에서 두 날짜 사이의 평균 윤년 수로 정확한 결과를 반환 하기 때문에 까다 롭습니다 .

/**
 * Compute person's age based on timestamp difference between birth date and given date
 * and prove it is INCORRECT approach.
 */
public class AgeUsingTimestamps {

public int getAge(Date today, Date dateOfBirth) {
    long diffAsLong = today.getTime() - dateOfBirth.getTime();
    Calendar diffAsCalendar = Calendar.getInstance();
    diffAsCalendar.setTimeInMillis(diffAsLong);
    return diffAsCalendar.get(Calendar.YEAR) - 1970; // base time where timestamp=0, precisely 1/1/1970 00:00:00 
}

    final static DateFormat df = new SimpleDateFormat("dd.MM.yyy HH:mm:ss");

    @Test
    public void test1() throws Exception {
        Date dateOfBirth = df.parse("10.1.2000 00:00:00");
        assertEquals(87, getAge(df.parse("08.1.2088 23:59:59"), dateOfBirth));
        assertEquals(87, getAge(df.parse("09.1.2088 23:59:59"), dateOfBirth));
        assertEquals(88, getAge(df.parse("10.1.2088 00:00:01"), dateOfBirth));
    }

    @Test
    public void test2() throws Exception {
        // between 2000 and 2021 was 6 leap days
        // but between 1970 (base time) and 1991 there was only 5 leap days
        // therefore age is switched one day earlier
            // See http://www.onlineconversion.com/leapyear.htm
        Date dateOfBirth = df.parse("10.1.2000 00:00:00");
        assertEquals(20, getAge(df.parse("08.1.2021 23:59:59"), dateOfBirth));
        assertEquals(20, getAge(df.parse("09.1.2021 23:59:59"), dateOfBirth)); // ERROR! returns incorrect age=21 here
        assertEquals(21, getAge(df.parse("10.1.2021 00:00:01"), dateOfBirth));
    }
}

1
public class CalculateAge { 

private int age;

private void setAge(int age){

    this.age=age;

}
public void calculateAge(Date date){

    Calendar calendar=Calendar.getInstance();

    Calendar calendarnow=Calendar.getInstance();    

    calendarnow.getTimeZone();

    calendar.setTime(date);

    int getmonth= calendar.get(calendar.MONTH);

    int getyears= calendar.get(calendar.YEAR);

    int currentmonth= calendarnow.get(calendarnow.MONTH);

    int currentyear= calendarnow.get(calendarnow.YEAR);

    int age = ((currentyear*12+currentmonth)-(getyears*12+getmonth))/12;

    setAge(age);
}
public int getAge(){

    return this.age;

}

0
/**
 * Compute from string date in the format of yyyy-MM-dd HH:mm:ss the age of a person.
 * @author Yaron Ronen
 * @date 04/06/2012  
 */
private int computeAge(String sDate)
{
    // Initial variables.
    Date dbDate = null;
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");      

    // Parse sDate.
    try
    {
        dbDate = (Date)dateFormat.parse(sDate);
    }
    catch(ParseException e)
    {
        Log.e("MyApplication","Can not compute age from date:"+sDate,e);
        return ILLEGAL_DATE; // Const = -2
    }

    // Compute age.
    long timeDiff = System.currentTimeMillis() - dbDate.getTime();      
    int age = (int)(timeDiff / MILLI_SECONDS_YEAR);  // MILLI_SECONDS_YEAR = 31558464000L;

    return age; 
}

실제로이 테스트를 수행했는지 여부는 확실하지 않지만 다른 방법으로는이 방법에 하나의 결함이 있습니다. 오늘이 생년월일과 오늘 <생일과 같은 달인 경우 여전히 실제 연령 + 1을 표시합니다. 예를 들어 bday가 1986 년 9 월 7 일이고 오늘이 2013 년 9 월 1 일인 경우 대신 27을 표시합니다.
srahul07 12

2
1 년의 밀리 초 수가 일정하지 않기 때문에 이것은 사실이 될 수 없습니다. 윤년에는 하루가 더 있습니다. 다른 것보다 훨씬 밀리 초입니다. 40 세인 사람의 알고리즘은 9-10 일 전에 생일을보고 할 수 있습니다. 윤초도 있습니다.
Espinosa

0

다음은 년, 월 및 일의 나이를 계산하는 Java 코드입니다.

public static AgeModel calculateAge(long birthDate) {
    int years = 0;
    int months = 0;
    int days = 0;

    if (birthDate != 0) {
        //create calendar object for birth day
        Calendar birthDay = Calendar.getInstance();
        birthDay.setTimeInMillis(birthDate);

        //create calendar object for current day
        Calendar now = Calendar.getInstance();
        Calendar current = Calendar.getInstance();
        //Get difference between years
        years = now.get(Calendar.YEAR) - birthDay.get(Calendar.YEAR);

        //get months
        int currMonth = now.get(Calendar.MONTH) + 1;
        int birthMonth = birthDay.get(Calendar.MONTH) + 1;

        //Get difference between months
        months = currMonth - birthMonth;

        //if month difference is in negative then reduce years by one and calculate the number of months.
        if (months < 0) {
            years--;
            months = 12 - birthMonth + currMonth;
        } else if (months == 0 && now.get(Calendar.DATE) < birthDay.get(Calendar.DATE)) {
            years--;
            months = 11;
        }

        //Calculate the days
        if (now.get(Calendar.DATE) > birthDay.get(Calendar.DATE))
            days = now.get(Calendar.DATE) - birthDay.get(Calendar.DATE);
        else if (now.get(Calendar.DATE) < birthDay.get(Calendar.DATE)) {
            int today = now.get(Calendar.DAY_OF_MONTH);
            now.add(Calendar.MONTH, -1);
            days = now.getActualMaximum(Calendar.DAY_OF_MONTH) - birthDay.get(Calendar.DAY_OF_MONTH) + today;
        } else {
            days = 0;
            if (months == 12) {
                years++;
                months = 0;
            }
        }
    }

    //Create new Age object
    return new AgeModel(days, months, years);
}

0

라이브러리가없는 가장 쉬운 방법 :

    long today = new Date().getTime();
    long diff = today - birth;
    long age = diff / DateUtils.YEAR_IN_MILLIS;

1
이 코드는 java.time 클래스로 대체 된 기존의 번거로운 날짜-시간 클래스를 사용합니다. 대신 Java에 내장 된 최신 클래스를 사용하십시오 ChronoUnit.YEARS.between( LocalDate.of( 1968 , Month.MARCH , 23 ) , LocalDate.now() ). 정답
Basil Bourque

DateUtils은 도서관이다
Terran

0

Java 8을 사용하면 한 줄의 코드로 사람 연령을 계산할 수 있습니다.

public int calCAge(int year, int month,int days){             
    return LocalDate.now().minus(Period.of(year, month, days)).getYear();         
}

년 또는 월에 나이? 달에 아기는 어떻습니까?
gumuruh

-1
public int getAge(Date dateOfBirth) 
{
    Calendar now = Calendar.getInstance();
    Calendar dob = Calendar.getInstance();

    dob.setTime(dateOfBirth);

    if (dob.after(now)) 
    {
        throw new IllegalArgumentException("Can't be born in the future");
    }

    int age = now.get(Calendar.YEAR) - dob.get(Calendar.YEAR);

    if (now.get(Calendar.DAY_OF_YEAR) < dob.get(Calendar.DAY_OF_YEAR)) 
    {
        age--;
    }

    return age;
}

@sinuhepop은 "DAY_OF_YEAR 비교는 윤년을 다룰 때 잘못된 결과를 초래할 수 있습니다"
Krzysztof Kot

-1
import java.io.*;

class AgeCalculator
{
    public static void main(String args[])
    {
        InputStreamReader ins=new InputStreamReader(System.in);
        BufferedReader hey=new BufferedReader(ins);

        try
        {
            System.out.println("Please enter your name: ");
            String name=hey.readLine();

            System.out.println("Please enter your birth date: ");
            String date=hey.readLine();

            System.out.println("please enter your birth month:");
            String month=hey.readLine();

            System.out.println("please enter your birth year:");
            String year=hey.readLine();

            System.out.println("please enter current year:");
            String cYear=hey.readLine();

            int bDate = Integer.parseInt(date);
            int bMonth = Integer.parseInt(month);
            int bYear = Integer.parseInt(year);
            int ccYear=Integer.parseInt(cYear);

            int age;

            age = ccYear-bYear;
            int totalMonth=12;
            int yourMonth=totalMonth-bMonth;

            System.out.println(" Hi " + name + " your are " + age + " years " + yourMonth + " months old ");
        }
        catch(IOException err)
        {
            System.out.println("");
        }
    }
}

-1
public int getAge(String birthdate, String today){
    // birthdate = "1986-02-22"
    // today = "2014-09-16"

    // String class has a split method for splitting a string
    // split(<delimiter>)
    // birth[0] = 1986 as string
    // birth[1] = 02 as string
    // birth[2] = 22 as string
    // now[0] = 2014 as string
    // now[1] = 09 as string
    // now[2] = 16 as string
    // **birth** and **now** arrays are automatically contains 3 elements 
    // split method here returns 3 elements because of yyyy-MM-dd value
    String birth[] = birthdate.split("-");
    String now[] = today.split("-");
    int age = 0;

    // let us convert string values into integer values
    // with the use of Integer.parseInt(<string>)
    int ybirth = Integer.parseInt(birth[0]);
    int mbirth = Integer.parseInt(birth[1]);
    int dbirth = Integer.parseInt(birth[2]);

    int ynow = Integer.parseInt(now[0]);
    int mnow = Integer.parseInt(now[1]);
    int dnow = Integer.parseInt(now[2]);

    if(ybirth < ynow){ // has age if birth year is lesser than current year
        age = ynow - ybirth; // let us get the interval of birth year and current year
        if(mbirth == mnow){ // when birth month comes, it's ok to have age = ynow - ybirth if
            if(dbirth > dnow) // birth day is coming. need to subtract 1 from age. not yet a bday
                age--;
        }else if(mbirth > mnow){ age--; } // birth month is comming. need to subtract 1 from age            
    }

    return age;
}

참고 : 날짜 형식은 yyyy-MM-dd입니다. 이것은 jdk7에서 테스트 된 일반적인 코드입니다.
Jhonie

1
주석을 제공하거나이 코드를 정확히 사용하는 방법을 설명하면 도움이됩니다. 단순히 코드 덤핑은 일반적으로 권장하지 않으며 질문 작성자는 왜 이런 식으로 메소드를 코딩하기로 결정했는지에 대한 선택을 이해하지 못할 수 있습니다.
rayryeng

@rayryeng : Jhonie는 이미 코드에 주석을 추가했습니다. 이해하기에 충분합니다. 그러한 의견을 제시하기 전에 생각하고 읽으십시오.
akshay

@ Akshay 그것은 나에게 분명하지 않았다. 뒤늦게 보면 코드가 버린 것처럼 보였습니다. 나는 보통 주석을 읽지 않습니다. 그것들이 몸에서 제거되어 설명으로 별도로 배치되면 좋을 것입니다. 그것은 내가 선호하는 것이며 우리는 여기에 동의하지 않을 수 있습니다 .... 그 말은 거의 2 년 전이었던 것처럼이 의견을 쓴 것을 잊었습니다.
rayryeng

@rayryeng :이 의견의 근본 원인은 부정적인 의견을 쓰면 사람들이 훌륭한 포럼을 사용하지 못하게하는 것입니다. 따라서 긍정적 인 의견을 제시하여 그들을 격려해야합니다. Bdw, 위반 없음. 건배!!!
akshay

-1
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.Period;

public class AgeCalculator1 {

    public static void main(String args[]) {
        LocalDate start = LocalDate.of(1970, 2, 23);
        LocalDate end = LocalDate.now(ZoneId.systemDefault());

        Period p = Period.between(start, end);
        //The output of the program is :
        //45 years 6 months and 6 days.
        System.out.print(p.getYears() + " year" + (p.getYears() > 1 ? "s " : " ") );
        System.out.print(p.getMonths() + " month" + (p.getMonths() > 1 ? "s and " : " and ") );
        System.out.print(p.getDays() + " day" + (p.getDays() > 1 ? "s.\n" : ".\n") );
    }//method main ends here.
}

3
StackOverflow에 참여해 주셔서 감사합니다. 몇 가지 제안. [A] 답변에 대한 토론을 포함하십시오. StackOverflow.com은 단순한 코드 스 니펫 컬렉션 이상의 의미를 갖습니다. 예를 들어, 코드에서 새로운 java.time 프레임 워크를 사용하는 반면 다른 답변은 대부분 java.util.Date 및 Joda-Time을 사용합니다. [B] 귀하의 답변을 java.time을 사용 하는 유사한 답변 과 Meno Hochschild 의 답변과 대조하십시오 . 자신이 어떻게 더 나은지 설명하거나 문제에 대해 다른 각도로 공격하십시오. 또는 더 나쁘지 않으면 당신을 철회하십시오.
바질 부르크

-1
public int getAge(Date birthDate) {
    Calendar a = Calendar.getInstance(Locale.US);
    a.setTime(date);
    Calendar b = Calendar.getInstance(Locale.US);
    int age = b.get(YEAR) - a.get(YEAR);
    if (a.get(MONTH) > b.get(MONTH) || (a.get(MONTH) == b.get(MONTH) && a.get(DATE) > b.get(DATE))) {
        age--;
    }
    return age;
}

-1

모든 정답에 감사하지만 동일한 질문에 대한 코 틀린 답변입니다.

kotlin 개발자에게 도움이되기를 바랍니다.

fun calculateAge(birthDate: Date): Int {
        val now = Date()
        val timeBetween = now.getTime() - birthDate.getTime();
        val yearsBetween = timeBetween / 3.15576e+10;
        return Math.floor(yearsBetween).toInt()
    }

우리가 처리 할 수있는 업계 최고의 java.time 클래스 가있을 때 이러한 수학을하는 것은 다소 어리석은 것처럼 보입니다 .
Basil Bourque 2016 년

Java의 OP 요청
Terran
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.