Bagaimana cara menghitung usia seseorang di Jawa?

147

Saya ingin mengembalikan usia bertahun-tahun sebagai int dalam metode Java. Apa yang saya miliki sekarang adalah yang berikut ini di mana getBirthDate () mengembalikan objek Date (dengan tanggal lahir ;-)):

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

    Date age = new Date(ageInMillis);

    return age.getYear();
}

Tetapi karena getYear () sudah usang saya bertanya-tanya apakah ada cara yang lebih baik untuk melakukan ini? Saya bahkan tidak yakin ini berfungsi dengan benar, karena saya belum memiliki unit test.

selamat
sumber
Mengubah pikiran saya tentang itu: pertanyaan lain hanya memiliki perkiraan tahun antara tanggal, bukan usia yang benar-benar benar.
cletus
Mengingat dia mengembalikan int, dapatkah Anda menjelaskan apa yang Anda maksud dengan usia yang 'benar'?
Brian Agnew
2
Kalender Tanggal vs Kalender adalah konsep dasar yang dapat diperoleh dari membaca dokumentasi Java. Saya tidak bisa mengerti mengapa hal ini begitu terangkat.
demongolem
@demongolem ??? Tanggal & Kalender mudah dipahami ?! Tidak, tidak sama sekali. Ada sejuta Pertanyaan tentang masalah ini di sini di Stack Overflow. Proyek Joda-Time menghasilkan salah satu perpustakaan paling populer, untuk menggantikan kelas waktu-tanggal yang merepotkan itu. Kemudian, Sun, Oracle, dan komunitas JCP menerima JSR 310 ( java.time ), mengakui bahwa kelas-kelas legacy sangat tidak memadai. Untuk info lebih lanjut, lihat Tutorial oleh Oracle .
Basil Bourque

Jawaban:

159

JDK 8 menjadikan ini mudah dan elegan:

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

Tes JUnit untuk menunjukkan penggunaannya:

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

Semua orang harus menggunakan JDK 8 sekarang. Semua versi sebelumnya telah melewati akhir masa dukungan mereka.

Duffymo
sumber
10
Perbandingan DAY_OF_YEAR dapat menyebabkan hasil yang salah ketika berhadapan dengan tahun kabisat.
sinuhepop
1
DateOfBirth variabel harus objek Date. Bagaimana saya bisa membuat objek Tanggal dengan tanggal lahir?
Erick
Mengingat kita sudah 9 tahun, dan dalam kasus Java 8 digunakan, ini harus menjadi solusi untuk digunakan.
novivive
JDK 9 adalah versi produksi saat ini. Lebih benar dari sebelumnya.
duffymo
2
@ SeveOh saya tidak setuju. Saya lebih suka tidak menerima nullsama sekali, melainkan menggunakan Objects.requireNonNull.
MC Emperor
170

Lihat Joda , yang menyederhanakan perhitungan tanggal / waktu (Joda juga merupakan dasar dari apis tanggal / waktu Java standar yang baru, jadi Anda akan mempelajari API yang segera menjadi standar).

EDIT: Java 8 memiliki sesuatu yang sangat mirip dan layak untuk dicoba.

misalnya

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

yang sesederhana yang Anda inginkan. Hal-hal pra-Java 8 agak (seperti yang telah Anda identifikasi) agak tidak intuitif.

Brian Agnew
sumber
2
@ HoàngLong: Dari JavaDocs: "Kelas ini tidak mewakili hari, tetapi instan milidetik di tengah malam. Jika Anda membutuhkan kelas yang mewakili sepanjang hari, maka Interval atau LocalDate mungkin lebih cocok." Kami benar - benar ingin mewakili kencan di sini.
Jon Skeet
Jika Anda ingin melakukannya dengan cara yang disarankan @JohnSkeet, seperti ini: Tahun usia = Tahun.yearsBetween (LocalDate baru (getBirthDate ()), LocalDate baru ());
Fletch
Tidak tahu mengapa saya menggunakan DateMidnight, dan saya perhatikan sekarang sudah usang. Sekarang diubah untuk menggunakan LocalDate
Brian Agnew
2
@IgorGanapolsky Memang perbedaan utamanya adalah: Joda-Time menggunakan konstruktor sementara Java-8 dan ThreetenBP menggunakan metode pabrik statis. Untuk bug halus dalam cara Joda-Time menghitung usia, silakan lihat jawaban saya di mana saya telah memberikan tinjauan umum tentang perilaku perpustakaan yang berbeda.
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
sumber
Ya, kelas kalendernya mengerikan. Sayangnya, di tempat kerja kadang-kadang saya harus menggunakannya: /. Terima kasih Cletus untuk memposting ini
Steve
1
Ganti Calendar.MONTH dan Calendar.DAY_OF_MONTH dengan Calendar.DAY_OF_YEAR dan setidaknya akan sedikit lebih bersih
Tobbbe
@Tobbbe Jika Anda lahir pada tanggal 1 Maret di tahun kabisat, maka tanggal lahir Anda pada tanggal 1 Maret di tahun berikutnya, bukan tanggal 2. DAY_OF_YEAR tidak akan berfungsi.
Airsource Ltd
42

Jawaban dan gambaran umum modern

a) Java-8 (paket java.time)

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

Perhatikan bahwa ekspresi LocalDate.now()secara implisit terkait dengan zona waktu sistem (yang sering diabaikan oleh pengguna). Untuk kejelasan itu umumnya lebih baik menggunakan metode kelebihan beban now(ZoneId.of("Europe/Paris"))menentukan zona waktu eksplisit (contohnya "Eropa / Paris"). Jika zona waktu sistem diminta maka preferensi pribadi saya adalah menulis LocalDate.now(ZoneId.systemDefault())untuk membuat hubungan dengan zona waktu sistem lebih jelas. Ini lebih merupakan upaya menulis tetapi membuat membaca lebih mudah.

b) Joda-Time

Harap perhatikan bahwa solusi Joda-Time yang diusulkan dan diterima menghasilkan hasil perhitungan yang berbeda untuk tanggal yang ditunjukkan di atas (kasus yang jarang terjadi), yaitu:

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

Saya menganggap ini sebagai bug kecil tetapi tim Joda memiliki pandangan yang berbeda tentang perilaku aneh ini dan tidak ingin memperbaikinya (aneh karena hari akhir bulan lebih kecil daripada tanggal mulai sehingga tahun seharusnya satu kurang). Lihat juga masalah tertutup ini .

c) java.util.Calendar dll.

Untuk perbandingan, lihat berbagai jawaban lainnya. Saya tidak akan merekomendasikan menggunakan kelas-kelas yang sudah usang ini sama sekali karena kode yang dihasilkan masih kesalahan dalam beberapa kasus eksotis dan / atau terlalu rumit mengingat fakta bahwa pertanyaan aslinya terdengar sangat sederhana. Pada tahun 2015 kami memiliki perpustakaan yang benar-benar lebih baik.

d) Tentang Date4J:

Solusi yang diusulkan sederhana tetapi kadang-kadang akan gagal jika tahun kabisat. Hanya mengevaluasi hari dalam setahun tidak dapat diandalkan.

e) Pustaka saya sendiri Time4J :

Ini berfungsi mirip dengan Java-8-solusi. Cukup ganti LocalDatedengan PlainDatedan ChronoUnit.YEARSoleh CalendarUnit.YEARS. Namun, mendapatkan "hari ini" memerlukan referensi zona waktu yang eksplisit.

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
Meno Hochschild
sumber
1
Terima kasih untuk versi Java 8! Menghemat waktu saya :) Sekarang saya hanya perlu mencari cara untuk mengekstrak sisa bulan. Misal 1 tahun dan 1 bulan. :)
thomas77
2
@ thomas77 Terima kasih atas balasan, gabungan tahun dan bulan (dan mungkin berhari-hari) dapat dilakukan menggunakan `java.time.Period 'di Java-8. Jika Anda juga ingin mempertimbangkan unit lain seperti jam maka Java-8 tidak menawarkan solusi.
Meno Hochschild
Sekali lagi terima kasih (dan atas tanggapan cepatnya) :)
thomas77
1
Saya sarankan menentukan zona waktu saat menggunakan LocalDate.now. Jika dihilangkan, zona waktu default JVM saat ini diterapkan secara implisit. Default itu dapat berubah antara mesin / OS / pengaturan, dan juga dapat setiap saat selama runtime oleh panggilan kode apa pun setDefault. Saya sarankan untuk spesifik, sepertiLocalDate.now( ZoneId.for( "America/Montreal" ) )
Basil Bourque
1
@GoCrafter_LP Ya, Anda dapat menerapkan ThreetenABP yang mensimulasikan Java-8, atau Joda-Time-Android (dari D. Lew) atau lib saya Time4A untuk versi Android yang lebih lama.
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;
}
Farhan Munir
sumber
2
Apa tujuan dari cek itu (birthDate.get(Calendar.DAY_OF_YEAR) - today.get(Calendar.DAY_OF_YEAR) > 3)? Tampaknya tidak ada gunanya dengan adanya perbandingan bulan dan hari.
Jed Schaaf
13

Saya hanya menggunakan milidetik dalam nilai konstan setahun untuk keuntungan saya:

Date now = new Date();
long timeBetween = now.getTime() - age.getTime();
double yearsBetween = timeBetween / 3.15576e+10;
int age = (int) Math.floor(yearsBetween);
Lou Morda
sumber
2
Ini bukan jawaban yang akurat ... tahun bukan 3.156e + 10 tetapi 3.15576e + 10 (seperempat hari!)
Maher Abuthraa
1
Ini tidak berfungsi, beberapa tahun adalah tahun kabisat dan memiliki nilai msec yang berbeda
Greg Ennis
12

Jika Anda menggunakan GWT, Anda akan dibatasi menggunakan java.util.Date, berikut adalah metode yang menganggap tanggal sebagai bilangan bulat, tetapi masih menggunakan 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;
}
Craigo
sumber
5

Jawaban yang benar menggunakan JodaTime adalah:

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

Anda bahkan dapat mempersingkat menjadi satu baris jika Anda mau. Saya menyalin ide dari jawaban BrianAgnew , tapi saya percaya ini lebih benar seperti yang Anda lihat dari komentar di sana (dan itu menjawab pertanyaan dengan tepat).

Fletch
sumber
4

Dengan perpustakaan date4j :

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

Ini adalah versi yang disempurnakan dari yang di atas ... mengingat Anda ingin usia menjadi 'int'. karena kadang-kadang Anda tidak ingin mengisi program Anda dengan banyak perpustakaan.

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;
}
cass
sumber
4

Mungkin mengejutkan untuk dicatat bahwa Anda tidak perlu tahu berapa hari atau bulan dalam satu tahun atau berapa hari dalam bulan-bulan itu, juga, Anda tidak perlu tahu tentang tahun kabisat, detik kabisat, atau apa pun semua itu menggunakan metode sederhana, akurat 100% ini:

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;
}
Weston
sumber
Saya mencari solusi untuk java 6 dan 5. Ini sederhana namun akurat.
Jj Tuibeo
3

Cobalah untuk menyalin yang ini dalam kode Anda, lalu gunakan metode untuk mendapatkan usia.

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;
}
Kevin
sumber
Kode hanya jawaban tidak disarankan. Akan lebih baik untuk menjelaskan mengapa kode ini dapat menjawab pertanyaan OP.
рüффп
Sebenarnya tidak ada otak apa-apa .. tetapi akan diperbarui hanya untuk mengatasi masalah Anda
Kevin
3

Saya menggunakan kode ini untuk perhitungan usia, Semoga ini bisa membantu .. tidak ada perpustakaan yang digunakan

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 ;
}
Ameen Maheen
sumber
2

Bidang kelahiran dan efek keduanya bidang tanggal:

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

Ini pada dasarnya merupakan modifikasi dari solusi John O tanpa menggunakan metode depresiasi. Saya menghabiskan cukup banyak waktu untuk mencoba agar kodenya berfungsi dalam kode saya. Mungkin ini akan menyelamatkan orang lain saat itu.

John B
sumber
2
dapatkah Anda menjelaskan ini sedikit lebih baik? bagaimana cara menghitung usia?
Jonathan S. Fisher
1

Bagaimana dengan yang ini?

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;
}
Andre P.
sumber
Ini adalah saran yang sangat lucu (ketika Anda tidak menggunakan Joda dan tidak dapat menggunakan Java 8) namun algoritma ini sedikit salah karena Anda berusia 0 hingga seluruh tahun pertama berlalu. Jadi, Anda perlu menambahkan satu tahun ke tanggal sebelum Anda memulai loop sementara.
Dagmar
1

String dateofbirthmemiliki tanggal lahir. dan format adalah apa saja (didefinisikan pada baris berikut):

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

Berikut cara memformat:

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());

Variabel ageStrakan memiliki tahun.

pengguna1955658
sumber
1

Elegan, tampaknya benarVarian , beda waktu timestamp dari solusi Yaron Ronen.

Saya menyertakan unit test untuk membuktikan kapan dan mengapa itu tidak benar . Tidak mungkin karena (mungkin) jumlah hari kabisat yang berbeda (dan detik) dalam perbedaan cap waktu. Perbedaan harus maks + -1 hari (dan satu detik) untuk algoritma ini, lihat test2 (), sedangkan solusi Yaron Ronen didasarkan pada asumsi yang sepenuhnya konstan daritimeDiff / MILLI_SECONDS_YEAR dapat berbeda 10 hari untuk usia 40 tahun, namun varian ini juga tidak benar.

Ini rumit, karena varian yang ditingkatkan ini, menggunakan rumus diffAsCalendar.get(Calendar.YEAR) - 1970, mengembalikan hasil yang benar sebagian besar waktu, karena jumlah tahun kabisat rata-rata sama antara dua tanggal.

/**
 * 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));
    }
}
Espinosa
sumber
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;

}
Vahid Pooreftekhari
sumber
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; 
}
Yaron Ronen
sumber
Tidak yakin apakah Anda benar-benar menguji yang ini atau tidak, tetapi untuk yang lain, metode ini memiliki satu kelemahan. jika hari ini adalah bulan yang sama dengan tanggal lahir Anda dan hari ini <ulang tahun, itu masih menunjukkan usia sebenarnya + 1, yaitu, misalnya jika hari Anda adalah 7 September 1986, dan hari ini adalah 1 September 2013, itu akan menunjukkan kepada Anda 27 sebagai gantinya dari 26.
srahul07
2
Ini tidak mungkin benar karena jumlah milidetik dalam setahun BUKAN KONSTAN. Tahun kabisat memiliki satu hari lebih banyak, itu jauh lebih banyak milidetik daripada yang lain. Untuk orang berusia 40 tahun, algoritme Anda dapat melaporkan tanggal lahir 9 - 10 hari lebih awal dari yang sebenarnya! Ada juga detik kabisat.
Espinosa
0

Berikut adalah kode java untuk menghitung usia dalam tahun, bulan, dan hari.

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);
}
akshay
sumber
0

Cara termudah tanpa perpustakaan:

    long today = new Date().getTime();
    long diff = today - birth;
    long age = diff / DateUtils.YEAR_IN_MILLIS;
lxknvlk
sumber
1
Kode ini menggunakan kelas tanggal waktu lama yang merepotkan yang sekarang merupakan warisan, digantikan oleh kelas java.time. Sebaliknya, gunakan kelas modern yang dibangun ke dalam Java: ChronoUnit.YEARS.between( LocalDate.of( 1968 , Month.MARCH , 23 ) , LocalDate.now() ). Lihat Jawaban yang benar
Basil Bourque
DateUtilsadalah perpustakaan
Terran
0

Dengan Java 8, kita dapat menghitung usia seseorang dengan satu baris kode:

public int calCAge(int year, int month,int days){             
    return LocalDate.now().minus(Period.of(year, month, days)).getYear();         
}
Mam
sumber
usia di tahun atau di bulan? bagaimana dengan bayi dalam sebulan?
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;
}
Stradivariuz
sumber
seperti @sinuhepop perhatikan "Perbandingan DAY_OF_YEAR dapat menyebabkan hasil yang keliru ketika berhadapan dengan tahun kabisat"
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("");
        }
    }
}
Surendar S
sumber
-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;
}
Jhonie
sumber
Catatan: Format tanggal adalah: yyyy-MM-dd. Ini adalah kode umum yang diuji dalam jdk7 ...
Jhonie
1
Ini akan membantu jika Anda memberikan beberapa komentar atau menjelaskan bagaimana tepatnya menggunakan kode ini. Cukup dumping kode biasanya tidak disarankan, dan penanya mungkin tidak memahami pilihan Anda mengapa Anda memutuskan untuk membuat kode metode ini dengan cara ini.
rayryeng
@rayryeng: Jhonie telah menambahkan komentar dalam kode. Itu cukup untuk dimengerti. Tolong pikirkan dan baca sebelum memberikan komentar seperti itu.
akshay
@ Ahshay itu tidak jelas bagiku. Kalau dipikir-pikir, sepertinya kode itu dibuang. Saya biasanya tidak membaca komentar. Akan lebih baik jika itu dikeluarkan dari tubuh dan ditempatkan secara terpisah sebagai penjelasan. Namun itu adalah preferensi saya dan kami dapat setuju untuk tidak setuju di sini .... Karena itu, saya lupa saya bahkan menulis komentar ini karena hampir dua tahun yang lalu.
rayryeng
@rayryeng: Alasan di balik komentar ini adalah, menulis komentar negatif membuat orang-orang enggan menggunakan forum yang bagus. Jadi, kita harus mendorong mereka dengan memberikan komentar positif. Bdw, jangan tersinggung. Bersulang!!!
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.
}
Dilshad Rana
sumber
3
Terima kasih telah berpartisipasi dalam StackOverflow. Beberapa saran untuk Anda. [A] Harap sertakan beberapa diskusi dengan Jawaban Anda. StackOverflow.com dimaksudkan untuk menjadi lebih dari sekedar koleksi potongan kode. Misalnya, perhatikan bagaimana kode Anda menggunakan kerangka kerja java.time baru sementara sebagian besar jawaban lainnya menggunakan java.util.Date dan Joda-Time. [B] Mohon kontraskan Jawaban Anda dengan Jawaban serupa oleh Meno Hochschild yang juga menggunakan java.time. Jelaskan bagaimana milik Anda lebih baik atau serang sudut yang berbeda pada masalahnya. Atau tarik kembali milik Anda jika tidak lebih baik.
Basil Bourque
-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;
}
sinuhepop
sumber
-1

Saya menghargai semua jawaban yang benar tetapi ini adalah jawaban kotlin untuk pertanyaan yang sama

Saya harap akan membantu pengembang 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()
    }
ramana vv
sumber
Ini agak konyol untuk melakukan matematika seperti itu ketika kita memiliki kelas java.time industri terkemuka yang kami miliki.
Basil Bourque
Permintaan OP di Jawa.
Terran