从BirthDate计算年龄

11 android datepicker

我有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;
    }
Run Code Online (Sandbox Code Playgroud)

Riy*_*ara 32

这是一个名为getAge的Java方法,它采用年月和日的整数,并返回一个String类型,该类型包含一个表示年龄的整数.

private String getAge(int year, int month, int day){
    Calendar dob = Calendar.getInstance();
    Calendar today = Calendar.getInstance();

    dob.set(year, month, 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;  
}
Run Code Online (Sandbox Code Playgroud)

  • 不敢相信这是得票最多的答案。它没有考虑闰年。如果任何日期(现在或出生日期)处于闰年,则此计算将中断。此外,Calendar 接受从 0 到 11 的月份,即 0 表示一月、12 月 11 日等。因此,我们在调用 dob.set(year,month,day); 时需要传递 Months - 1; 当然,这一点需要提及。 (4认同)
  • 今天的日期是 2017 年 7 月 30 日,生日输入是 07/30/1999 - 年龄输出是 17,应该是 18。即使你输入 07/29/1999 作为你的生日输入年龄仍然是 17。 (3认同)
  • @OleV.V. 关于闰年:考虑 01.03.2015 出生的人,查询 29.02.2016(此处使用德语 dd.mm.yyyy) - 此函数将产生 1 岁,但应为 0。 (3认同)
  • @Erick 在您提到的两种情况下,我的年龄都为 18 岁。也许您使用过“new GregorianCalendar(1999, 7, 29)”或类似的?7 意味着八月,而不是人们预期的七月。这是避免使用旧的和过时的 `Calendar` 类的众多原因之一。 (3认同)
  • 这个答案是不正确的,考虑闰年. (2认同)
  • 现在明白你的意思了,@IARI(我很慢)。使用年中的日期是不正确的,因为它与闰年和非闰年中的日期不对应。例如,在闰年 4 月 11 日是第 102 天,在非闰年它是 101。所以问题中的代码可能会在一个人的生日附近给出不正确的结果。 (2认同)
  • 对于那些阅读,此代码不支持Le年。 (2认同)

deH*_*aar 12

时间

为了完整性和关于包的最新信息,这里是使用的方式 java.time(Java 8+)的方式。

爪哇

public int getAge(int year, int month, int dayOfMonth) {
    return Period.between(
                LocalDate.of(year, month, dayOfMonth),
                LocalDate.now()
            ).getYears();
}
Run Code Online (Sandbox Code Playgroud)

科特林

public int getAge(int year, int month, int dayOfMonth) {
    return Period.between(
                LocalDate.of(year, month, dayOfMonth),
                LocalDate.now()
            ).getYears();
}
Run Code Online (Sandbox Code Playgroud)

两个片段都需要从以下导入java.time:

import java.time.LocalDate;
import java.time.Period
Run Code Online (Sandbox Code Playgroud)

不建议使用java.util.Date和java.util.Calendar,除非您必须涉及大量遗留代码。

另请参阅Oracle 教程。

对于支持 Java 6 或 7 的项目,此功能可通过ThreeTenBP 获得,
而有特殊版本ThreeTenABPAndroid 中于 API 级别低于 26。

更新现在在 Android 中
有API Desugaring,它使(一部分)java.time直接可用(不再需要向后移植库)到低于 26 的 API 级别(不是真正降到版本 1,但可以用于大多数应该支持的 API 级别)如今)。

  • 调用需要 API 26。 (3认同)

Paw*_*iya 7

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;
}
Run Code Online (Sandbox Code Playgroud)


Ros*_*tan 5

这是该类的 Kotlin 扩展,返回与对象Date对应的年龄Date

val Date.age: Int
get() {
    val calendar = Calendar.getInstance()
    calendar.time = Date(time - Date().time)
    return 1970 - (calendar.get(Calendar.YEAR) + 1)
}
Run Code Online (Sandbox Code Playgroud)

它兼容所有 Android 版本。如果您想知道“1970”是什么,那就是 Unix 纪元。时间戳为 0,即 1970 年 1 月 1 日。

  • 这个 Kotlin 版本工作得很好,正如它所说,适用于所有版本的 Android,这里的很多解决方案都使用需要 8.0 的 LocalDate (2认同)

小智 2

      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());
}
Run Code Online (Sandbox Code Playgroud)

之后创建一个类

 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;
    }
    else
    {
        resMonth=endMonth-startMonth;
        resMonth=12+resMonth;
        resYear--;
    }

}
public void  calcualteDay()
{

    if(endDay>=startDay)
    {
         resDay= endDay-startDay;
    }
    else
    {
        resDay=endDay-startDay;
        resDay=30+resDay;
        if(resMonth==0)
        {
            resMonth=11;
            resYear--;
        }
        else
        {
            resMonth--;
        }

    }
}

public String getResult()
{
    return resDay+":"+resMonth+":"+resYear;
}
Run Code Online (Sandbox Code Playgroud)