Javaで誰かの年齢を計算するにはどうすればよいですか?


146

Javaメソッドのintとして年齢を返します。私が今持っているのは、getBirthDate()がDateオブジェクト(誕生日;-)を返す次のようなものです。

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

    Date age = new Date(ageInMillis);

    return age.getYear();
}

しかしgetYear()は非推奨であるため、これを行うより良い方法があるかどうか疑問に思っていますか?(まだ)ユニットテストが実施されていないため、これが正しく機能するかどうかさえわかりません。


それについて私の考えを変えました:他の質問は日付の間のおよその年数だけを持ち、本当に正しい年齢ではありません。
cletus 2009

彼がintを返していることを考えると、「正しい」年齢が何を意味するのかを明確にできますか?
ブライアンアグニュー

2
日付とカレンダーは、Javaのドキュメントを読むことで収集できる基本的な概念です。なぜこれがそんなに賛成されるのか理解できません。
デーモンゴレム2012

@demongolem ??? 日付&カレンダーがわかりやすい?!いいえ、まったくありません。この件に関するスタックオーバーフローに関する質問は多数あります。Joda-Timeプロジェクトは、最も厄介な日時クラスの代わりに、最も人気のあるライブラリの1つを作成しました。その後、サン、オラクル、およびJCPコミュニティはJSR 310java.time)を受け入れ、レガシークラスが不十分であることを認めました。詳しくは、Tutorial by Oracleを参照してください。
バジルブルク2018

回答:


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 2012

1
変数dateOfBirthはDateオブジェクトでなければなりません。生年月日で日付オブジェクトを作成するにはどうすればよいですか?
エリック

私たちが9年になったという事実、およびJava 8が使用されている場合を考慮すると、これが使用されるソリューションであるはずです。
18

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から:「このクラスは1日を表すのではなく、真夜中のミリ秒の瞬間を表します。1日を表すクラスが必要な場合は、IntervalまたはLocalDateの方が適している場合があります。」ここでは実際に日付を表現たいと思います。
Jon Skeet、2012年

@JohnSkeetが提案する方法でそれを実行したい場合、次のようになります。
Fletch

なぜ DateMidnightを使用したのかわからないので現在は非推奨になっています。LocalDateを使用するように変更
Brian Agnew

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

2
@IgorGanapolsky確かに主な違いは次のとおりです。Joda-Timeはコンストラクターを使用しますが、Java-8とThreetenBPは静的ファクトリーメソッドを使用します。Joda-Timeが年齢を計算する方法の微妙なバグについては、さまざまなライブラリの動作に関する概要を示した私の回答をご覧ください。
Meno Hochschild、

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.MONTHとCalendar.DAY_OF_MONTHをCalendar.DAY_OF_YEARに置き換えてください。少なくとも少しきれいになります
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チームはこの奇妙な動作について別の見方をしており、修正したくありません(奇妙なことに、終了日は開始日よりも短いため、年は1つ少ない)。この終了した問題も参照してください。

c)java.util.Calendarなど

比較のために、他のさまざまな回答を参照してください。元の質問が非常に単純に聞こえるという事実を考慮すると、結果として得られるコードは一部のエキゾチックなケースでエラーが発生しやすく、複雑すぎるため、これらの古いクラスを使用することはお勧めしません。2015年には、本当に良い図書館ができました。

d)Date4Jについて:

提案された解決策は単純ですが、うるう年の場合には失敗することがあります。年の日を評価するだけでは信頼できません。

e)私自身のライブラリTime4J

これは、Java-8ソリューションと同様に機能します。ただ、交換するLocalDateことにより、PlainDateおよびChronoUnit.YEARSCalendarUnit.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、2015

再度ありがとうございます(迅速な対応):)
thomas77

1
の使用時にタイムゾーンを指定することをお勧めしLocalDate.nowます。省略すると、JVMの現在のデフォルトのタイムゾーンが暗黙的に適用されます。このデフォルトは、マシン/ OS /設定間で変化する可能性があり、実行時にコードを呼び出すことにより、いつでも変化する可能性がありますsetDefault。次のように具体的にすることをお勧めしますLocalDate.now( ZoneId.for( "America/Montreal" ) )
バジル・ブルク

1
@GoCrafter_LPはい。Java-8をシミュレートするThreetenABP、またはJ.-Time-Android(D. Lewから)、またはそのような古いバージョンのAndroidには私のlib Time4Aを適用できます。
Meno Hochschild、

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)ですか?月と日の比較が存在するので、それは無意味なようです。
Jed Schaaf 2016

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;
}

12

私は単に、年の定数値にミリ秒を使用しているのが私の利点です。

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
これは機能しません。うるう年で、msec値が異なる年もあります
Greg Ennis

5

JodaTimeを使用した正解は次のとおりです。

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

必要に応じて、1行に短縮することもできます。私は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

1年の日数や月数、またはそれらの月の日数を知る必要がないことは、おそらく驚くべきことです。同様に、うるう年やうるう秒などについて知る必要はありません。この単純で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

フィールドbirthとeffectはどちらも日付フィールドです。

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
これについてもう少し説明してもらえますか?これはどのように年齢を計算しますか?
ジョナサンS.フィッシャー

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を使用できない場合)。ただし、最初の1年が終わるまで0になるため、アルゴリズムは少し間違っています。したがって、whileループを開始する前に、日付に年を追加する必要があります。
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日異なる可能性がありますが、このバリアントも正しくありません。

この改善されたバリアントは、数式を使用してdiffAsCalendar.get(Calendar.YEAR) - 1970、2つの日付間で平均して同じうるう年数として正しい結果を返すことが多いため、注意が必要です。

/**
 * 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つの欠点があります。今日があなたの誕生日と同じ月で今日<誕生日の場合、それでも実際の年齢+ 1が表示されます。たとえば、bdayが1986年9月7日で、今日が2013年9月1日の場合、代わりに27と表示されます。 of 26.
srahul07

2
1年のミリ秒数は一定ではないため、これは当てはまりません。うるう年は1日長くなります。つまり、他の年よりもミリ秒長くなります。40歳の人の場合、アルゴリズムは9〜10日前に誕生日を報告する場合がありますが、実際にはそうです。うるう秒もあります。
エスピノサ

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() )正解を
バジルブルク2017

DateUtilsライブラリです
Terran

0

Java 8では、1行のコードで人の年齢を計算できます。

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

年または月の年齢?月の赤ちゃんはいかがですか?
グムル

0

私はすべての正しい答えに感謝しますが、これは同じ質問に対するコトリンの答えです

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クラスを自由に利用できる場合に、このような計算を行うのはかなりばかげているように見えます。
バジルブルク2018年

JavaのOPリクエスト。
テラン

-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 2014

@rayryeng:Jhonieはすでにコードにコメントを追加しています。それで十分です。そのようなコメントをする前に考えて読んでください。
akshay 2016年

私には明らかではなかった@Akshay。後で考えてみると、彼はコードをダンプしたように見えました。普段コメントは読みません。説明としてそれらを体から外して別々に置いたらいいですね。それは私の好みですが、ここで反対することに同意することができます...とはいえ、ほぼ2年前だったので、このコメントを書いたことすら忘れていました。
rayryeng 2016年

@rayryeng:このコメントの背後にある理由は、否定的なコメントを書くことが人々にそのような素晴らしいフォーラムの使用を思いとどまらせることでした。だから、私たちは前向きなコメントを与えることで彼らを励ますべきです。Bdw、問題ありません。乾杯!!!
akshay 2016年

-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による同様の回答と比較してください。自分がどのように優れているか、または問題に対して別の角度から攻撃するかを説明してください。または、良くない場合は自分のものを撤回します。
バジルブルク2015

-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;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.