java根据身份证号或生日计算年龄

简介: 最近的项目中需要根据身份证号来计算年龄。废话少说,上代码。 private static final int invalidAge = -1;//非法的年龄,用于处理异常。

最近的项目中需要根据身份证号来计算年龄。废话少说,上代码。

 private static final int invalidAge = -1;//非法的年龄,用于处理异常。
/**
    *根据身份证号码计算年龄
     * @param idNumber 考虑到了15位身份证,但不一定存在
     */

    public static int getAgeByIDNumber(String idNumber) {
        String dateStr;
        if (idNumber.length() == 15) {
            dateStr = "19" + idNumber.substring(6, 12);
        } else if (idNumber.length() == 18) {
            dateStr = idNumber.substring(6, 14);
        } else {//默认是合法身份证号,但不排除有意外发生
            return invalidAge;
        }


        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
        try {
            Date birthday = simpleDateFormat.parse(dateStr);
            return getAgeByDate(birthday);
        } catch (ParseException e) {
            return invalidAge;
        }


    }

    /**
     *根据生日计算年龄
     * @param dateStr 这样格式的生日 1990-01-01
     */

    public static int getAgeByDateString(String dateStr) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date birthday = simpleDateFormat.parse(dateStr);
            return getAgeByDate(birthday);
        } catch (ParseException e) {
            return -1;
        }
    }


    public static int getAgeByDate(Date birthday) {
        Calendar calendar = Calendar.getInstance();

        //calendar.before()有的点bug
        if (calendar.getTimeInMillis() - birthday.getTime() < 0L) {
            return invalidAge;
        }


        int yearNow = calendar.get(Calendar.YEAR);
        int monthNow = calendar.get(Calendar.MONTH);
        int dayOfMonthNow = calendar.get(Calendar.DAY_OF_MONTH);

        calendar.setTime(birthday);


        int yearBirthday = calendar.get(Calendar.YEAR);
        int monthBirthday = calendar.get(Calendar.MONTH);
        int dayOfMonthBirthday = calendar.get(Calendar.DAY_OF_MONTH);

        int age = yearNow - yearBirthday;


        if (monthNow <= monthBirthday && monthNow == monthBirthday && dayOfMonthNow < dayOfMonthBirthday || monthNow < monthBirthday) {
            age--;
        }

        return age;
    }


有的人可能会问采用异常来处理非法年龄,我在这简单说明,在工作中,我一般会尽量避免异常的发生,毕竟出现了崩溃不是什么好事,特别是在Android开发中。

目录
相关文章
|
5月前
|
Java
承压计算 Java
承压计算 Java
31 1
|
16天前
|
架构师 Java 程序员
Java架构师的工作年龄是什么?
Java架构师的工作年龄是什么?
20 0
|
3月前
|
搜索推荐 Java 大数据
Java中的数据流处理与流式计算实现
Java中的数据流处理与流式计算实现
|
3月前
|
并行计算 Java 大数据
Java中的高效并行计算与多线程编程技术
Java中的高效并行计算与多线程编程技术
|
4月前
|
Java 测试技术 API
滚雪球学Java(52):一步一步教你使用Java Calendar类进行日期计算
【6月更文挑战第6天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
37 3
滚雪球学Java(52):一步一步教你使用Java Calendar类进行日期计算
|
4月前
|
Java API
探讨Java集合的组内平均值计算
探讨Java集合的组内平均值计算
32 1
|
3月前
|
并行计算 监控 Java
Java中的并行计算与任务分发策略
Java中的并行计算与任务分发策略
|
3月前
|
并行计算 Java 大数据
Java中的高效并行计算与多线程编程技术
Java中的高效并行计算与多线程编程技术
|
4月前
|
IDE Java 数据库连接
JAVA注解:元数据,代码的“身份证”?!
【6月更文挑战第29天】Java注解,作为代码的“身份证”,提供元数据,用于编译时检查、自动生成代码和框架集成。例如,@Override确保方法重写正确,@Deprecated标记过时,@Autowired在Spring中实现依赖注入。Lombok的@Getter/@Setter简化getter/setter。注解提升代码质量和效率,是现代Java开发的关键实践。
26 0
|
4月前
|
Java 容器
中缀表达式计算(java)
中缀表达式计算(java)
下一篇
无影云桌面