我有一个DatePicker对话框,当我选择日期时,我想计算年龄,它是有效的,但当我选择当年的日期时,它显示的是-1年龄而不是0,那么如何解决这个问题?请帮助我解决这个问题。 我的代码如下。

public int getAge(int year, int month, int day) {
        GregorianCalendar cal = new GregorianCalendar();
        int y, m, d, noofyears;
        y = cal.get(Calendar.YEAR);// current year ,
        m = cal.get(Calendar.MONTH);// current month
        d = cal.get(Calendar.DAY_OF_MONTH);// current day
        cal.set(year, month, day);// here ur date
        noofyears = (int) (y - cal.get(Calendar.YEAR));
        LOGD("Age......", String.valueOf(noofyears));
        if ((m < cal.get(Calendar.MONTH)) || ((m == cal.get(Calendar.MONTH)) && (d < cal.get(Calendar.DAY_OF_MONTH)))) {
            --noofyears;
        LOGD("Age......", String.valueOf(noofyears));
        if (noofyears != 0) {
            ageCount = noofyears;
        } else {
            ageCount = 0;
        if (noofyears < 0)
            throw new IllegalArgumentException("age < 0");
        return noofyears;
    
4 个评论
But My app become crash in if (noofyears < 0) throw new IllegalArgumentException("age < 0"); return noofyears;
当应用程序崩溃时,你选择的日期是什么?
今天的当前日期
android
datepicker
user5418227
发布于 2016-08-16
18 个回答
deHaar
deHaar
发布于 2020-12-30
0 人赞同

java.time

为完整起见,并在软件包方面有所更新,这里是使用java.time(爪哇 8+)的方法。

public int getAge(int year, int month, int dayOfMonth) {
    return Period.between(
                LocalDate.of(year, month, dayOfMonth),
                LocalDate.now()
            ).getYears();

Kotlin

fun getAge(year: Int, month: Int, dayOfMonth: Int): Int {
    return Period.between(
                LocalDate.of(year, month, dayOfMonth),
                LocalDate.now()
            ).years

Both snippets need the following imports from java.time:

import java.time.LocalDate;
import java.time.Period

不建议再使用java.util.Datejava.util.Calendar,除非你必须涉及相当大量的遗留代码的情况。

另见甲骨文教程.

For projects supporting 爪哇 6 or 7, this functionality is available via the ThreeTenBP,
虽然有特殊版本,但三田ABP对于安卓系统中低于26的API级别。

There's API解ugaring现在在安卓系统中,这使得(替换代码0的一个子集)java.time可以直接用于26级以下的API级别(并没有真正下降到版本1,但对于现在应该支持的大多数API级别来说是可以的)。

调用需要API 26。
@RohaitasTanoli 当然,你读过整个答案吗,尤其是最后两段?
Pawan Chaurasiya
Pawan Chaurasiya
发布于 2020-12-30
0 人赞同
private int getAge(String dobString){
    Date date = null;
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    try {
        date = sdf.parse(dobString);
    } catch (ParseException e) {
        e.printStackTrace();
    if(date == null) return 0;
    Calendar dob = Calendar.getInstance();
    Calendar today = Calendar.getInstance();
    dob.setTime(date);
    int year = dob.get(Calendar.YEAR);
    int month = dob.get(Calendar.MONTH);
    int day = dob.get(Calendar.DAY_OF_MONTH);
    dob.set(year, month+1, day);
    int age = today.get(Calendar.YEAR) - dob.get(Calendar.YEAR);
    if (today.get(Calendar.DAY_OF_YEAR) < dob.get(Calendar.DAY_OF_YEAR)){
        age--;
    return age;
    
Rostan
Rostan
发布于 2020-12-30
0 人赞同

下面是Date类的Kotlin扩展,返回与Date对象对应的年龄。

val Date.age: Int
get() {
    val calendar = Calendar.getInstance()
    calendar.time = Date(time - Date().time)
    return 1970 - (calendar.get(Calendar.YEAR) + 1)

它兼容所有的安卓版本。如果你想知道'1970'是什么,那是Unix Epoch。时间戳是1970年1月1日的0。

不,它没有。你测试过吗?
这个Kotlin版本非常好用,正如它所说的,可以在所有版本的安卓系统中使用,这里的很多解决方案都使用LocalDate,需要8.0版本。
shubham
shubham
发布于 2020-12-30
0 人赞同
 private boolean getAge(int year, int month, int day) {
    try {
        Calendar dob = Calendar.getInstance();
        Calendar today = Calendar.getInstance();
        dob.set(year, month, day);
        int monthToday = today.get(Calendar.MONTH) + 1;
        int monthDOB = dob.get(Calendar.MONTH)+1;
        int age = today.get(Calendar.YEAR) - dob.get(Calendar.YEAR);
        if (age > 18) {
            return true;
        } else if (age == 18) {
            if (monthDOB > monthToday) {
                return true;
            } else if (monthDOB == monthToday) {
                int todayDate = today.get(Calendar.DAY_OF_MONTH);
                int dobDate = dob.get(Calendar.DAY_OF_MONTH);
                if (dobDate <= todayDate) { // should be less then
                    return true;
                } else {
                    return false;
            } else {
                return false;
        } else {
            return false;
    } catch (Exception e) {
        e.printStackTrace();
    return false;
    
Narendra Sorathiya
Narendra Sorathiya
发布于 2020-12-30
0 人赞同
public static int getPerfectAgeInYears(int year, int month, int date) {
    Calendar dobCalendar = Calendar.getInstance();
    dobCalendar.set(Calendar.YEAR, year);
    dobCalendar.set(Calendar.MONTH, month);
    dobCalendar.set(Calendar.DATE, date);
    int ageInteger = 0;
    Calendar today = Calendar.getInstance();
    ageInteger = today.get(Calendar.YEAR) - dobCalendar.get(Calendar.YEAR);
    if (today.get(Calendar.MONTH) == dobCalendar.get(Calendar.MONTH)) {
        if (today.get(Calendar.DAY_OF_MONTH) < dobCalendar.get(Calendar.DAY_OF_MONTH)) {
            ageInteger = ageInteger - 1;
    } else if (today.get(Calendar.MONTH) < dobCalendar.get(Calendar.MONTH)) {
        ageInteger = ageInteger - 1;
    return ageInteger;

考虑今天的日期 - 【替换代码1

If Birthdate - 29th July 1993, the output - 27

如果出生日期 - 29th August 1993,输出 - 27

If Birthdate - 30th August 1993, the output - 27

If Birthdate - 31st August 1993, the output - 26

If Birthdate - 31st September 1993, the output - 26

Youn Tivoli
Youn Tivoli
发布于 2020-12-30
0 人赞同

现在是kotlin语言。

import java.util.Calendar
fun main(args: Array<String>) {
print(getAge(yyyy,mm,dd))
 fun getAge(year: Int, month: Int, day: Int): String {
    val dob = Calendar.getInstance()
    val today = Calendar.getInstance()
    dob.set(year, month, day)
    var age = today.get(Calendar.YEAR) - dob.get(Calendar.YEAR)
    if (today.get(Calendar.DAY_OF_YEAR) < dob.get(Calendar.DAY_OF_YEAR)) {
        age--
    val ageInt = age + 1
    return ageInt.toString()
    
顺便说一下,这些可怕的日期-时间类已经被java.timeJSR 310中定义的类。请看现代的解决方案,在由deHaar回答.
Nagini Kandula
Nagini Kandula
发布于 2020-12-30
0 人赞同
      private void calculateAge() {
    age.calcualteYear();
    age.calcualteMonth();
    age.calcualteDay();
    age.calculateMonths();
    age.calTotalWeeks();
    age.calTotalHours();
    age.calTotalMins();
    age.calTotalSecs();
    age.calTotalMilsecs();
    // Toast.makeText(getContext(), "click the resulted button"+age.getResult() , Toast.LENGTH_SHORT).show();
    result.setText("AGE (DD/MM/YY) :" + age.getResult());

之后,创建一个类

 public class AgeCalculation {
private int startYear;
private int startMonth;
private int startDay;
private int endYear;
private int endMonth;
private int endDay;
private int resYear;
private int resMonth;
private int resDay;
private Calendar start;
private Calendar end;
public String getCurrentDate()
      end=Calendar.getInstance();
      endYear=end.get(Calendar.YEAR);
      endMonth=end.get(Calendar.MONTH);
      endMonth++;
      endDay=end.get(Calendar.DAY_OF_MONTH);
      return endDay+":"+endMonth+":"+endYear;
public void setDateOfBirth(int sYear, int sMonth, int sDay)
 startYear=sYear;
 startMonth=sMonth;
 startDay=sDay;
public void calcualteYear()
    resYear=endYear-startYear/(365);
public void calcualteMonth()
    if(endMonth>=startMonth)
         resMonth= endMonth-startMonth;
        resMonth=endMonth-startMonth;
        resMonth=12+resMonth;
        resYear--;
public void  calcualteDay()
    if(endDay>=startDay)
         resDay= endDay-startDay;
        resDay=endDay-startDay;
        resDay=30+resDay;
        if(resMonth==0)
            resMonth=11;
            resYear--;
            resMonth--;
public String getResult()
    return resDay+":"+resMonth+":"+resYear;
    
0 人赞同
public String getAge(int year, int month, int day) {
        Calendar dob = Calendar.getInstance();
        Calendar today = Calendar.getInstance();
        dob.set(year, month-1, day);
        int age = today.get(Calendar.YEAR) - dob.get(Calendar.YEAR);
        if (today.get(Calendar.DAY_OF_YEAR) < dob.get(Calendar.DAY_OF_YEAR)) {
            age--;
        Integer ageInt = new Integer(age);
        String ageS = ageInt.toString();
        return ageS;
    
月份从0到11开始
Ido
Ido
发布于 2020-12-30
0 人赞同
static int calculateAge(int birthdayDay, int birthdayMonth, int birthdayYear)
    DateTime date = DateTime(birthdayYear, birthdayMonth, birthdayDay).toLocal();
    DateTime now = DateTime.now().toLocal();
    return now.difference(date).inDays ~/ 365.2425;
    
Joshua
Joshua
发布于 2020-12-30
0 人赞同
public int getAge(int year, int month, int day) {
    final Calendar birthDay = Calendar.getInstance();
    birthDay.set(year, month, day);
    final Calendar current = Calendar.getInstance();
    if (current.getTimeInMillis() < birthDay.getTimeInMillis())
        throw new IllegalArgumentException("age < 0");
    int age = current.get(Calendar.YEAR) - birthDay.get(Calendar.YEAR);
    if (birthDay.get(Calendar.MONTH) > current.get(Calendar.MONTH) ||
            (birthDay.get(Calendar.MONTH) == current.get(Calendar.MONTH) &&
                    birthDay.get(Calendar.DATE) > current.get(Calendar.DATE)))
        age--;
    return age;
    
Not Working properly
Chi Minh Trinh
Chi Minh Trinh
发布于 2020-12-30
0 人赞同

这是我在源代码中的实现方式,我已经测试过了。希望它是有用的。

public static int getAge(String dateTime, String currentFormat) {
    SimpleDateFormat dateFormat = new SimpleDateFormat(currentFormat);
    try {
        Date date = dateFormat.parse(dateTime);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH);
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        Date currentDate = new Date();
        Calendar currentCalendar = Calendar.getInstance();
        currentCalendar.setTime(currentDate);
        int currentYear = currentCalendar.get(Calendar.YEAR);
        int currentMonth = currentCalendar.get(Calendar.MONTH);
        int currentDay = currentCalendar.get(Calendar.DAY_OF_MONTH);
        int deltaYear = currentYear - year;
        int deltaMonth = currentMonth - month;
        int deltaDay = currentDay - day;
        if (deltaYear > 0) {
            if (deltaMonth < 0) {
                deltaYear --;
            } else if (deltaDay < 0){
                deltaYear --;
            return deltaYear;
    } catch (java.text.ParseException e) {
        e.printStackTrace();
    return 0;
    
pruthwiraj.kadam
pruthwiraj.kadam
发布于 2020-12-30
0 人赞同
String getAgeInOther(int year, int month, int day) {
    Calendar today = Calendar.getInstance();
    Calendar birth = Calendar.getInstance();
    birth.set(year, month, day);
    Calendar temp = Calendar.getInstance();
    temp.set(year, month, day);
    int totalDays = 0;
    int intMonth=0,intDays=0;
    for (int iYear = birth.get(Calendar.YEAR); iYear <= today.get(Calendar.YEAR); iYear++) {
        if (iYear == today.get(Calendar.YEAR) && iYear == birth.get(Calendar.YEAR)) {
            for (int iMonth = birth.get(Calendar.MONTH); iMonth <= today.get(Calendar.MONTH); iMonth++) {
                temp.set(iYear, iMonth, 1);
                if ((iMonth == today.get(Calendar.MONTH)) && (iMonth == birth.get(Calendar.MONTH))) {
                    totalDays += today.get(Calendar.DAY_OF_MONTH) - birth.get(Calendar.DAY_OF_MONTH);
                } else if ((iMonth != today.get(Calendar.MONTH)) && (iMonth != birth.get(Calendar.MONTH))) {
                    totalDays += temp.getActualMaximum(Calendar.DAY_OF_MONTH);
                    intMonth++;
                }else  if ((iMonth == birth.get(Calendar.MONTH))) {
                    totalDays +=( birth.getActualMaximum(Calendar.DAY_OF_MONTH)- birth.get(Calendar.DAY_OF_MONTH));
                } else  if ((iMonth == today.get(Calendar.MONTH))){
                    totalDays += today.get(Calendar.DAY_OF_MONTH);
                    if (birth.get(Calendar.DAY_OF_MONTH)<today.get(Calendar.DAY_OF_MONTH))
                        intMonth++;
                        intDays=today.get(Calendar.DAY_OF_MONTH)-birth.get(Calendar.DAY_OF_MONTH);
                    }else {
                        temp.set(today.get(Calendar.YEAR),today.get(Calendar.MONTH)-1,1);
                        intDays=temp.getActualMaximum(Calendar.DAY_OF_MONTH)-birth.get(Calendar.DAY_OF_MONTH)+today.get(Calendar.DAY_OF_MONTH);
        } else if ((iYear != today.get(Calendar.YEAR)) && (iYear != birth.get(Calendar.YEAR))) {
            for (int iMonth = 0; iMonth < 12; iMonth++) {
                temp.set(iYear, iMonth, 1);
                totalDays += temp.getActualMaximum(Calendar.DAY_OF_MONTH);
                intMonth++;
        } else if (((iYear) == birth.get(Calendar.YEAR))) {
            for (int iMonth = birth.get(Calendar.MONTH); iMonth < 12; iMonth++) {
                temp.set(iYear, iMonth, 1);
                if ((iMonth == birth.get(Calendar.MONTH))) {
                    totalDays += (birth.getActualMaximum(Calendar.DAY_OF_MONTH)-birth.get(Calendar.DAY_OF_MONTH));
                } else {
                    intMonth++;
                    totalDays += temp.getActualMaximum(Calendar.DAY_OF_MONTH);
        } else if (iYear == today.get(Calendar.YEAR)) {
            for (int iMonth = 0; iMonth <= today.get(Calendar.MONTH); iMonth++) {
                temp.set(iYear, iMonth, 1);
                if ((iMonth == today.get(Calendar.MONTH))) {
                    totalDays += today.get(Calendar.DAY_OF_MONTH);
                    if (birth.get(Calendar.DAY_OF_MONTH)<today.get(Calendar.DAY_OF_MONTH))
                        intMonth++;
                        intDays=today.get(Calendar.DAY_OF_MONTH)-birth.get(Calendar.DAY_OF_MONTH);
                    }else {
                        temp.set(today.get(Calendar.YEAR),today.get(Calendar.MONTH)-1,1);
                        intDays=temp.getActualMaximum(Calendar.DAY_OF_MONTH)-birth.get(Calendar.DAY_OF_MONTH)+today.get(Calendar.DAY_OF_MONTH);
                } else {
                    intMonth++;
                    totalDays += temp.getActualMaximum(Calendar.DAY_OF_MONTH);
    int  ageYear=intMonth/12;
    int  ageMonth=intMonth%12;
    int ageDays=intDays;
    //TODO if you want age in YEAR:MONTH:DAY REMOVE COMMENTS
   //TODO  return ageYear+":"+ageMonth+":"+ageDays;  
    return ""+totalDays;//todo TOTAL AGE IN DAYS
    
adarsh
adarsh
发布于 2020-12-30
0 人赞同
public static String calculateAge(String strDate) {
    int years = 0;
    int months = 0;
    int days = 0;
    try {
        long timeInMillis = Long.parseLong(strDate);
        Date birthDate = new Date(timeInMillis);
        //create calendar object for birth day
        Calendar birthDay = Calendar.getInstance();
        birthDay.setTimeInMillis(birthDate.getTime());
        //create calendar object for current day
        long currentTime = System.currentTimeMillis();
        Calendar now = Calendar.getInstance();
        now.setTimeInMillis(currentTime);
        //Get difference between years
        years = now.get(Calendar.YEAR) - birthDay.get(Calendar.YEAR);
        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;
            if (now.get(Calendar.DATE) < birthDay.get(Calendar.DATE))
                months--;
        } 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;
        //adarsh
        if (currMonth > birthMonth) {
            if (birthDay.get(Calendar.DATE) > now.get(Calendar.DATE)) {
                months = months - 1;
        }//---------------------------------
    } catch (Exception e) {
        e.printStackTrace();
    //Create new Age object
    return years + " Y " + months + " M " + days + " days";
    
Juan Sainz
Juan Sainz
发布于 2020-12-30
0 人赞同

Here is my solution in Kotlin:

import java.time.LocalDateTime
fun getAge(birthYear: Int, birthMonth: Int, birthDay: Int): Int {
    var age: Int = LocalDateTime.now().year - birthYear
    if (birthMonth > LocalDateTime.now().monthValue || birthMonth == LocalDateTime.now().monthValue && birthDay > LocalDateTime.now().dayOfMonth) { age-- }
    if (age < 0) { age = 0 }
    return age
    
suyash saurabh
suyash saurabh
发布于 2020-12-30
0 人赞同
int age =0;
age = yearLatest - yearBirth;
if (monthAge > currentMonth) {
    if (age != 0) {
        age = age - 1;
} else if(monthAge == currentMonth){
    if (dayAge > currentDay) {
        if (age != 0) {
            age = age - 1;
return age;
    
TheMatrix
TheMatrix
发布于 2020-12-30
0 人赞同

如果我们想直接检查年龄是否低于或高于X年龄,那么我们可以使用LocalDate类型,适用于所有的Android API级别。

LocalDate.now().minusYears(18).isBefore(value) //value is your localDate
    
erluxman
erluxman
发布于 2020-12-30
0 人赞同

This is the shortest I could get it to.

static int calculateAge(Calendar birthDay){
       Calendar today = Calendar.getInstance();
       int age = today.get(Calendar.YEAR) - birthDay.get(Calendar.YEAR);
       if (birthDay.get(Calendar.DAY_OF_YEAR) < today.get(Calendar.DAY_OF_YEAR)) {
                age--;
       return age;
    
Rahul Dev Garg
Rahul Dev Garg
发布于 2020-12-30
0 人赞同

使用DateTime的新语言Dart

static int getPerfectAgeInYears(DateTime dob,DateTime today) {
dob = DateTime(dob.year,dob.month,dob.day);
int ageInteger = 0;
today = DateTime(today.year,today.month,today.day);
ageInteger = today.year-dob.year;
if (today.month == dob.month) {
  if (today.day < dob.day) {
    ageInteger = ageInteger - 1;
} else if (today.month < dob.month) {
  ageInteger = ageInteger - 1;
return ageInteger;}

调用为print(getPerfectAgeInYears(DateTime(2000,6,4),DateTime.now())。 考虑今天的日期 - 2020年8月30日