Java日期時間API系列34-----Jdk8中java.time包中的新的日期時間API類應用,使用Period一行代碼計算生日。

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

 

 

源代碼地址:https://github.com/xkzhangsan/xk-time

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章