我们的身份证号码包含很多的信息,下面的代码提供了身份证的解析功能,具体看注释吧,已经写全了

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;/*** @author Rob Sivan* @date 2022/9/19 20:30* @describe 身份证解析工具类*/public class IDCardUtil {public static void main(String[] args) {//预获取身份证号码System.out.println("请输入身份证号码:");String SId = new Scanner(System.in).nextLine();if (SId.length() == 15) {SId = SIdConversion(SId);}if (SId.length() != 18) {System.out.println("请输入有效的身份证号码!");} else if (IDVerification(SId)) {// 前六位表示地址码,精确到县char[] areaCode = new char[6];for (int i = 0; i < 6; i++) {areaCode[i] = SId.charAt(i);}String area = new String(areaCode);// 从身份证中获取出生年月日并转换为Stringchar[] birthDate = new char[8];for (int i = 0; i < 8; i++) {birthDate[i] = SId.charAt(i + 6);}//获取当前日期并转换为字符串Date date = new Date();SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");String nowDate = df.format(date);//根据二者转换出年龄int age = (Integer.parseInt(nowDate) - Integer.parseInt(String.valueOf(birthDate))) / 10000;StringBuilder sb = new StringBuilder(String.valueOf(birthDate));sb.insert(4, "-");sb.insert(7, "-");String birth = sb.toString();// 得到17位性别码String gender = SId.charAt(16) % 2 == 1 ? "男" : "女";// 执行输出方法printInfo(area, birth, gender, age);}}// 15位身份证转18位方法public static String SIdConversionE(String SId) { // 解析版String sid;// 前六位表示地址码,精确到县char[] areaCode = new char[8];for (int i = 0; i < 6; i++) {areaCode[i] = SId.charAt(i);}String area = new String(areaCode);// 第七到十二位为出生年月日,较18位身份证少了年的前两位char[] birthDate = new char[8];birthDate[0] = '1';birthDate[1] = '9';for (int i = 2; i < 8; i++) {birthDate[i] = SId.charAt(i + 4);}String birth = new String(birthDate);// 第十三到十四位char[] otherNum = new char[2];for (int i = 0; i < 2; i++) {otherNum[i] = SId.charAt(i + 12);}String other = new String(otherNum);// 第十五位性别String gander = SId.substring(14);// 通过最后三位得到此时的17位身份证String SIdTemp = area + birth + other + gander;// 将此时15+2=17位的身份证与对应加权位数字相乘并相加final int[] WEIGHTING_FACTOR = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; // 加权因子int sum = 0;for (int i = 0; i < 18; i++) {int a = SIdTemp.charAt(i);int b = WEIGHTING_FACTOR[i];sum = sum + (a * b);}// 将和对11取模得到最后一位校验码final String[] CHECK_CODE = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"}; // 校验码String check = CHECK_CODE[((sum / 11) - 1)];// 17位身份证加上最后一位校验码得到18位身份证sid = SIdTemp + check;return sid;}public static String SIdConversion(String SId) {StringBuilder sb = new StringBuilder(SId);sb.insert(6, "19");String s = sb.toString();System.out.println(s);final int[] WEIGHTING_FACTOR = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; // 加权因子int sum = 0;for (int i = 0; i < 17; i++) {int a = s.charAt(i) - 48;int b = WEIGHTING_FACTOR[i];sum += a * b;}System.out.println(sum);int checkNum = sum % 11;String[] CHECK_CODE = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"}; // 校验码return s + CHECK_CODE[checkNum];}// 验证身份证是否正确public static boolean IDVerification(String SId) {String check = SId.substring(17);final int[] WEIGHTING_FACTOR = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; // 加权因子int sum = 0;for (int i = 0; i < 17; i++) {int a = SId.charAt(i) - 48;int b = WEIGHTING_FACTOR[i];sum += a * b;}int checkNum = sum % 11;
//        System.out.println(checkNum);final String[] CHECK_CODE = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"}; // 校验码return check.equals(CHECK_CODE[checkNum]);}// 输出方法public static void printInfo(String area, String birth, String gender, int age) {System.out.println("-----身份证ID解析成功!-----");System.out.println("该身份证持有人的地区码为:" + area +"\n出生日期为:" + birth +"\n性别为" + gender +"\n当前年龄为:" + age);}
}

首先会判断输入数字是否满足18位或15位,不满足直接抛出异常,之后再对15位转18位处理,在切割获得区域代码、生日,利用性别码判断出性别,最后通过生日计算当前年龄,最后输出,具体使用场景肯定不会这样调用,多用在从前端获取到身份证号后,后端直接进行解析该用户的信息,直接存于数据库,减少用户输入,并可以反馈给前端部分用户信息用作展示。

嗯,就这么多,主要是通过思路,小阿凡继续溜咯~

JAVA 输入身份证号码进行验证正误,15位转18位,并解析出生日、当前年龄、地区代码、性别相关推荐

  1. Jquery 对 身份证号码的验证 (15/18位)

    //欢迎验证.给予指正错误,从好多地方查来的资料修改的...已用本人身份证验证... 由于以前修改的问题无法验证带 X 的身份证号码,已修复!//为值添加0function Append_zore(t ...

  2. Java实现身份证号码的验证,JAVA后台验证身份证号码

    代码如下: package cn.gov.csrc.util;/*** 18 位身份证验证器* * @author admin* */ public class IDCard {final int[] ...

  3. Java判断身份证号码

    1.描述 用java语言判断身份证号码是否有效,地区码.出身年月.校验码等验证算法 2.源代码 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...

  4. JAVA 身份证号码有效性验证

    本文转自:http://www.blogjava.net/zeroline/archive/2011/01/03/342227.html </pre><pre name=" ...

  5. Java 从身份证号码中获取出生日期、性别、年龄(15位和18位)

    项目场景: 提示:这次做项目的时候遇到一个工具,整理出来以后可以直接使用 问题描述:给一个String 类型的 身份证号码,需要从这串数字中获取出生日期.性别.年龄 身份证号码分为 15 位 和18 ...

  6. 使用Java编写Hive的UDF实现身份证号码校验及15位升级18位

    使用Java编写Hive的UDF实现身份证号码校验及15位升级18位 背景 在数仓项目中,有时候会根据身份证信息做一些取数filter或者条件判断的相关运算进而获取到所需的信息.古人是用Oracle做 ...

  7. 验证(15位或者18位)身份证号码的正确正则表达式

    我们在开发页面的过程中难免会遇到一些表单验证,以下就对身份证号码进行验证,在开发过程中做的简单笔记: 身份证号码: 18位(xxxxxx yy MM dd xxxx) 15位(xxxxxx yy MM ...

  8. 15位或18位长度身份证号码JS验证

    免责声明:身份证号为随机组合而成,不会涉及任何隐私泄密问题,也非现实生活中真实的身份证号码:身份证号码所属年龄均为18岁以上,均已通过校验. var IdNum1 = "3205831986 ...

  9. Java身份证号码严格验证(第18位校验码算法实现)

    /*** 身份证号码的格式:610821-20061222-612-X 由18位数字组成:前6位为地址码,第7至14位为出生日期码,第15至17位为顺序码,* 第18位为校验码.检验码分别是0-10共 ...

最新文章

  1. 大厂php怎么做前端,大厂前端经典面试问题精选(附答案)
  2. Java Review - ArrayList 源码解读
  3. Matlab中配置LibSVM 总结
  4. boost::describe模块实现打印功能的测试程序
  5. webpack编译过程
  6. 上周热点回顾(7.9-7.15)
  7. python实现视频关键帧提取(基于帧间差分)
  8. bootstrap使用
  9. java invokelater 以及invokeandwait
  10. 提问的智慧(学习笔记)
  11. java计算机毕业设计家庭安防系统MyBatis+系统+LW文档+源码+调试部署
  12. bili弹幕姬_bilibili弹幕姬怎么用 - 卡饭网
  13. Eclipse4.6(neno)手动配置Tomcat插件
  14. Unity中的矩阵含义
  15. 运用matlab求身高质量指数BMI值
  16. Aircrack-ng支持网卡列表(上)
  17. 全国大学生软件测试大赛Web应用测试(二)Selenium功能测试环境配置
  18. python recv_python网络编程调用recv函数完整接收数据的三种方法
  19. etch下面,用wine可以安装超星阅览器
  20. 前亚马逊工程师:广告系统架构解密

热门文章

  1. 软件无线电技术学习资料大汇总
  2. Linux内核(2)——子系统
  3. 实用小工具:加密软件
  4. 传输层——计算机网络
  5. 别再问我“输入URL到页面呈现”啦
  6. 程序员去美国工作:工作在加州的华为
  7. 【webshell管理工具之一】中国菜刀
  8. 2022 199管综真题及答案解析
  9. 计算机函数公式发生额总计,如何用Excel Sumif函数做查询模板统计客户在不同时间借款的总金额...
  10. 求助!spyder beautifulsoup4显示错误:AttributeError: 'HTMLParserTreeBuilder' object has no attribute 'initia