通过Java日期时间API系列9-----Jdk8中java.time包中的新的日期时间API类的Period和Duration的区别中得知,Period可以比较2个日期相差的年月日。年龄计算是2个日期相差的年的值,具体还要根据月日微调,如果小于生日年龄减1。下面使用Period可以非常方便的计算年龄。
1.使用Period一行代码计算生日
核心代码就是一行代码:
Period.between(birthDay, LocalDate.now()).getYears();
/*** 计算年龄
*@parambirthDay
*@returnint 年龄*/
public static intgetAge(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{returnperiod.getYears();
}
}/*** 计算年龄
*@parambirthDay
*@returnint 年龄*/
public static intgetAge(Date birthDay){returngetAge(DateTimeConverterUtil.toLocalDate(birthDay));
}/*** 计算年龄
*@parambirthDay
*@returnint 年龄*/
public static intgetAge(LocalDateTime birthDay){returngetAge(DateTimeConverterUtil.toLocalDate(birthDay));
}
测试代码:
/*** 年龄生日测试*/@Testpublic voidgetAgeBirthDayTest(){
Date date= DateTimeCalculatorUtil.getDate(2000, 6, 4);
System.out.println(DateTimeCalculatorUtil.getAge(date));
}
输出:
20
2.使用Java8以前的Calendar计算生日
public static int getAgeByBirth(Date birthDay) throwsParseException {int age = 0;
Calendar cal=Calendar.getInstance();if (cal.before(birthDay)) { //出生日期晚于当前时间,无法计算
throw newIllegalArgumentException("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--;//当前月份在生日之前,年龄减一
}
}returnage;
}
原地址:https://blog.csdn.net/sunnyljs/java/article/details/80934685
测试代码
@Testpublic void getAgeByBirthTest() throwsParseException{
Date date= DateTimeCalculatorUtil.getDate(2000, 6, 4);
System.out.println(getAgeByBirth(date));
}
输出
20
3.对比上面2种方法,Java8 时间api非常方便。
(1)Period线程安全。
(2)Period一行代码非常简洁。