通過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一行代碼非常簡潔。