通过Java日期时间API系列9-----Jdk8中java.time包中的新的日期时间API类的Period和Duration的区别中得知,Period可以比较2个日期相差的年月日。年龄计算是2个日期相差的年的值,具体还要根据月日微调,如果小于生日年龄减1。下面使用Period可以非常方便的计算年龄。
1.使用Period一行代码计算生日
核心代码就是一行代码:
Period.between(birthDay, LocalDate.now()).getYears();
/\*\* \* 计算年龄
\* @param birthDay
\* @return int 年龄 \*/
public static int getAge(LocalDate birthDay){
Objects.requireNonNull(birthDay, "birthDay");
Period period \= Period.between(birthDay, LocalDate.now()); if (period.getYears() < 0) { throw new DateTimeException("birthDay is before now!");
} else { return period.getYears();
}
} /\*\* \* 计算年龄
\* @param birthDay
\* @return int 年龄 \*/
public static int getAge(Date birthDay){ return getAge(DateTimeConverterUtil.toLocalDate(birthDay));
} /\*\* \* 计算年龄
\* @param birthDay
\* @return int 年龄 \*/
public static int getAge(LocalDateTime birthDay){ return getAge(DateTimeConverterUtil.toLocalDate(birthDay));
}
测试代码:
/\*\* \* 年龄生日测试 \*/ @Test public void getAgeBirthDayTest(){
Date date \= DateTimeCalculatorUtil.getDate(2000, 6, 4);
System.out.println(DateTimeCalculatorUtil.getAge(date));
}
输出:
20
2.使用Java8以前的Calendar计算生日
public static int getAgeByBirth(Date birthDay) throws ParseException { int age = 0; Calendar cal = Calendar.getInstance(); if (cal.before(birthDay)) { //出生日期晚于当前时间,无法计算 throw new IllegalArgumentException( "The birthDay is before Now.It's unbelievable!"); } int yearNow = cal.get(Calendar.YEAR); //当前年份 int monthNow = cal.get(Calendar.MONTH); //当前月份 int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH); //当前日期 cal.setTime(birthDay); int yearBirth = cal.get(Calendar.YEAR); int monthBirth = cal.get(Calendar.MONTH); int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH); age = yearNow - yearBirth; //计算整岁数 if (monthNow <= monthBirth) { if (monthNow == monthBirth) { if (dayOfMonthNow < dayOfMonthBirth) age--;//当前日期在生日之前,年龄减一 } else { age--;//当前月份在生日之前,年龄减一 } } return age; }
原地址:https://blog.csdn.net/sunnyljs/java/article/details/80934685
测试代码
@Test public void getAgeByBirthTest() throws ParseException{ Date date = DateTimeCalculatorUtil.getDate(2000, 6, 4); System.out.println(getAgeByBirth(date)); }
输出
20
3.对比上面2种方法,Java8 时间api非常方便。
(1)Period线程安全。
(2)Period一行代码非常简洁。