【问题标题】:How can I calculate age in Java accurately given Date of birth给定出生日期,如何准确计算 Java 中的年龄
【发布时间】:2015-12-22 08:21:42
【问题描述】:

我正在尝试计算占月数的 java 年龄,因此仅减去年数是行不通的。我还想告诉用户今天是否是他们的生日。这是我到目前为止的代码,但恐怕它有点偏离。即使它比较的两个日期相等,它也不会告诉今天是否是生日。我最初尝试计算的方式是使用毫秒。您看到 2 种获取当前日期的方法的原因是因为我正在尝试一些方法来使其正常工作,但想向所有人展示我的工作,以便他们可以为我指明正确的方向。

编辑澄清 我的意思是 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));


    }

}

【问题讨论】:

  • 澄清你所说的“数月”是什么意思你想要一个年龄是 22 岁零 4 个月,还是你只是说 2015-1993 可以是 22 岁或 21 岁,这取决于他们的生日今年已经过去了
  • 道歉。我的意思是 2015-1993 可以是 22 岁或 21 岁,这取决于他们今年的生日是否已经过去
  • @alphamalle 请将此类附加信息或说明作为对您问题的编辑而不是作为评论发布。不要让你的读者这么努力。

标签: java android date calendar compareto


【解决方案1】:

Answer by Nate 很好。但它忽略了时区的问题。还有一种更明确的方法可能。

时区

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

如果省略,则隐式应用 JVM 当前的默认时区。我建议您改为明确说明您期望/希望的时区。

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

java.time

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

您可以查询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,您没有 Java 8 技术,例如 java.time。

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

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

【讨论】:

    【解决方案2】:

    这对我有用。

    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;
    

    【讨论】:

    • 仅供参考,麻烦的旧日期时间类,如 java.util.Datejava.util.Calendarjava.text.SimpleTextFormat 现在是 legacy,被 java.time 类取代。
    • 感谢您提供的信息,他们应该将其标记为已弃用。无论如何,这是解决我的问题的最简单的方法。
    【解决方案3】:

    这是我用来确定某物的年龄的代码。

    Long time= currentDate.getTime / 1000 - birthdate.getTime / 1000
    
    int years = Math.round(time) / 31536000;
    int months = Math.round(time - years * 31536000) / 2628000; 
    

    【讨论】:

    • 这是正确年龄的最简单答案。
    • 虽然这是一个非常简单的答案。我不明白为什么我们在第二行需要Math.round(time) 而不仅仅是time
    • 几乎准确但不完全
    【解决方案4】:

    下面是一个示例,说明如何计算一个人的年龄,如果今天是他们的生日,以及如果今天不是他们的生日,还剩下多少天是使用新的 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!");
      }
    

    【讨论】:

    • 我试图让它工作,但无法解决 chronounit。我正在使用 jdk 8。
    • 添加这个导入:import java.time.temporal.ChronoUnit;
    • 修复了它。不知道为什么,但直到我在 android studio 中重建两次后它才能解决导入问题。
    猜你喜欢
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    相关资源
    最近更新 更多