如何在出生日期准确计算出Java的年龄

时间:2015-09-24 16:19:05

标签: java android date calendar compareto

我正在尝试计算占用几个月的java的年龄,所以只是减去年数是行不通的。我还想告诉用户今天是他们的生日。这是我到目前为止的代码,但我担心它有点偏。它也不会告诉今天是否是生日,即使它比较的两个日期是相等的。我试图最初计算的方式是使用毫秒。你看到获得当前日期的两种方法的原因是因为我正在尝试让它工作,但是想向每个人展示我的工作,以便他们能够指出我正确的方向。

编辑澄清 我的意思是2015-1993可以是22岁或21岁,这取决于他们今年的生日已经过去了。我想确保在考虑到这一点后得到正确的年龄。

public class ShowAgeActivity extends AppCompatActivity {

private TextView usersAge;

private static long daysBetween(Date one, Date two)
{
    long difference = (one.getTime()-two.getTime())/86400000; return Math.abs(difference);
}

private Date getCurrentForBirthday()
{
    Date birthday = (Date) this.getIntent().getExtras().get("TheBirthDay");
    int birthdayYear = birthday.getYear() + 1900;
    Calendar cal = Calendar.getInstance();
    cal.set(birthdayYear, Calendar.MONTH, Calendar.DAY_OF_MONTH);
    Date current = cal.getTime();
    return current;
}


protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_show_age);


    Date birthday = (Date) this.getIntent().getExtras().get("TheBirthDay");
      Date currentDay = Calendar.getInstance().getTime();

      long age = daysBetween(birthday,currentDay)/365;

      usersAge =(TextView)findViewById(R.id.ageTextView);

    if (birthday.compareTo(getCurrentForBirthday()) == 0 )
    {
        usersAge.setText("It is your birthday, and your Age is " + String.valueOf(age));
    }

    usersAge.setText("Your Age is " + String.valueOf(age));


    }

}

4 个答案:

答案 0 :(得分:7)

下面是一个如何计算一个人的年龄的例子,如果今天是他们的生日,以及如果今天不是他们的生日使用新的java.time包类,他们将在生日前剩下多少天它们作为Java 8的一部分包含在内。

  LocalDate today             = LocalDate.now();
  LocalDate birthday          = LocalDate.of(1982, 9, 26);
  LocalDate thisYearsBirthday = birthday.with(Year.now());

  long age = ChronoUnit.YEARS.between(birthday, today);

  if (thisYearsBirthday.equals(today))
  {
     System.out.println("It is your birthday, and your Age is " + age);
  }
  else
  {
     long daysUntilBirthday = ChronoUnit.DAYS.between(today, thisYearsBirthday);
     System.out.println("Your age is " + age + ". " + daysUntilBirthday + " more days until your birthday!");
  }

答案 1 :(得分:3)

这是我用来弄清楚有多旧东西的代码。

<html>
    <body ng-app="myApp">
        <div ng-controller="TopNavController as topNav">
            <top-nav></top-nav>
        </div>
        <!-- assume more markup here.... -->
        <button ng-click="topNav.showLoginDialog()">
    </body>
</html>

答案 2 :(得分:2)

Answer by Nate很好。但它忽略了时区问题。并且可以采用更明确的方法。

时区

时区对于确定日期至关重要。例如,巴黎的新日早些时候比蒙特利尔早了。

如果省略,则隐式应用JVM的当前默认时区。我建议你明确指出你期望/渴望的时区。

使用proper time zone name,洲/城市风格。切勿使用3-4字母代码,例如“EST”或“IST”。

java.time

Java 8及更高版本中内置的java.time框架(Tutorial)包含Period类,用于表示一个时间跨度,即组合年数,月数和天数。

您可以查询Period以提取这三个组件中的每一个。

默认情况下,期间的toString方法会生成ISO 8601定义的格式的字符串,其中P标记开头,后跟数字和字母三次。例如,一年半:P1Y6M

ZoneId zoneId = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( zoneId );
LocalDate birthdate = LocalDate.of( 1960 , 2 , 17 );
Period p = Period.between( birthdate , today );
String output = p.toString();
Integer age = p.getYears();
Boolean isTodayBirthday = ( (p.getMonths() == 0 )  && ( p.getDays() == 0 ) );

另一种方法是使用MonthDay类来表示没有一年的月日。

Boolean isBirthdayToday = 
    MonthDay.from( birthdate )
            .equals( MonthDay.from( today ) ) ;

的Android

对于Android,您没有Java 8技术,例如java.time。

您可以搜索一些反向运行java.time类的项目。我不知道他们有多成功。

此外,您可以使用Joda-Time,这是一个启发了java.time框架(JSR 310)的第三方库。 Joda-Time代码应该类似于上面的代码。除了Period类具有更好的分辨率外,还有小时,分钟和秒。要截断该额外数据,请调用withTimeAtStartOfDay方法。

答案 3 :(得分:1)

这适合我。

Calendar currentDate = Calendar.getInstance();

SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd");

Date birthdate = null;

try {
     birthdate = myFormat.parse(yourDate);
} catch (ParseException e) {
     e.printStackTrace();
}

Long time= currentDate.getTime().getTime() / 1000 - birthdate.getTime() / 1000;

int years = Math.round(time) / 31536000;
int months = Math.round(time - years * 31536000) / 2628000;