• 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

  • 相关阅读:
    汉字机内码的特点
    while(~scanf(..))的用法
    【C语言】八进制转十进制
    【C语言】按字典顺序排序
    【C语言】矩阵相乘
    【C语言】魔方阵
    【C语言】统计候选人的得票数
    【C语言】对输入的字符串中C关键词的查找统计
    20201231《信息安全导论》第十二周学习总结
    20201231《信息安全导论》第十一周学习总结
  • 原文地址:https://www.cnblogs.com/xkzhangsanx/p/13047131.html
Copyright © 2020-2023  润新知