package com.ljl.util;import java.util.Calendar;
import java.util.stream.IntStream;/*** 身份证号码验证* 1、号码的结构* 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。从左至右依次为:六位数字地址码,* 八位数字出生日期码,三位数字顺序码和一位数字校验码。* 2、地址码(前六位数)* 表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。* 3、出生日期码(第七位至十四位)* 表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。* 4、顺序码(第十五位至十七位)* 表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,* 顺序码的奇数分配给男性,偶数分配给女性。* 5、校验码(第十八位数)* (1)十七位数字本体码加权求和公式 S = Sum(Ai Wi), i = 0, , 16 ,先对前17位数字的权求和 ;* Ai:表示第i位置上的身份证号码数字值; Wi:表示第i位置上的加权因子 Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2* (2)计算模 Y = mod(S, 11)* (3)通过模( 0 1 2 3 4 5 6 7 8 9 10)得到对应的校验码 Y:1 0 X 9 8 7 6 5 4 3 2*/
public class IdentityUtils {// 身份证校验码private static final int[] COEFFICIENT_ARRAY = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};// 身份证号的尾数规则private static final String[] IDENTITY_MANTISSA = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};private static final String IDENTITY_PATTERN = "^[0-9]{17}[0-9Xx]$";public static boolean isLegalPattern(String identity) {if (identity == null) {return false;}if (identity.length() != 18) {return false;}if (!identity.matches(IDENTITY_PATTERN)) {return false;}char[] chars = identity.toCharArray();long sum = IntStream.range(0, 17).map(index -> {char ch = chars[index];int digit = Character.digit(ch, 10);int coefficient = COEFFICIENT_ARRAY[index];return digit * coefficient;}).summaryStatistics().getSum();// 计算出的尾数索引int mantissaIndex = (int) (sum % 11);String mantissa = IDENTITY_MANTISSA[mantissaIndex];String lastChar = identity.substring(17);if (lastChar.equalsIgnoreCase(mantissa)) {return true;} else {return false;}}//计算年龄public static int getAgefromBirthTime(String birthTimeString){// 先截取到字符串中的年、月、日String strs[] = birthTimeString.trim().split("-");int selectYear = Integer.parseInt(strs[0]);int selectMonth = Integer.parseInt(strs[1]);int selectDay = Integer.parseInt(strs[2]);// 得到当前时间的年、月、日Calendar cal = Calendar.getInstance();int yearNow = cal.get(Calendar.YEAR);int monthNow = cal.get(Calendar.MONTH) + 1;int dayNow = cal.get(Calendar.DATE);// 用当前年月日减去生日年月日int yearMinus = yearNow - selectYear -1;int monthMinus = monthNow - selectMonth;int dayMinus = dayNow - selectDay;int age = yearMinus;if (yearMinus < 0) {// 选了未来的年份age = 0;} else if (yearMinus == 0) {// 同年的,要么为1,要么为0if (monthMinus < 0) {// 选了未来的月份age = 0;} else if (monthMinus == 0) {// 同月份的if (dayMinus < 0) {// 选了未来的日期age = 0;} else if (dayMinus >= 0) {age = 1;}} else if (monthMinus > 0) {age = 1;}} else if (yearMinus > 0) {if (monthMinus < 0) {// 当前月>生日月} else if (monthMinus == 0) {// 同月份的,再根据日期计算年龄if (dayMinus < 0) {} else if (dayMinus >= 0) {age = age + 1;}} else if (monthMinus > 0) {age = age + 1;}}return age;}
}

很好的校验身份证工具类,忘记在哪个网站找的了,现保存一下以后可以再用到。

if (IdentityUtils.isLegalPattern(data.getArchivesIdcard())){//识别性别和生日并计算年龄String sex;if (Integer.parseInt(CardCode.substring(16).substring(0, 1)) % 2 == 0) {// 判断性别sex = "女";} else {sex = "男";}String birthday = "";birthday = data.getArchivesIdcard().substring(6,10)+"年"+data.getArchivesIdcard().substring(10,12)+"月"+data.getArchivesIdcard().substring(12,14)+"日";data.setArchivesBirthday(birthday);String birthDate = "";birthDate = data.getArchivesIdcard().substring(6,10)+"-"+data.getArchivesIdcard().substring(10,12)+"-"+data.getArchivesIdcard().substring(12,14);data.setArchivesAges(IdentityUtils.getAgefromBirthTime(birthDate));
}else{result.put("data", "");result.put("errcode", 1001);result.put("errmsg", "请检查身份证是否正确");return result;
}

JAVA:18位身份证号码验证工具类(识别性别和生日、计算年龄)相关推荐

  1. 15/18位身份证号码验证

    15/18位身份证号码验证 在做身份证验证之前你得明确身份证号的组成. 首先我告诉你,18位身份证号码后面的字母只有"X"这一个.(X是罗马数字的10,用X来代替10,可以保证您的 ...

  2. 15/18位身份证号码验证的正则表达式总结(详细版)

    前言 开发过程中,常常需要对一些输入信息进行有效性验证,使用正则表达式进行校验是最简单.效率最高的方式了,下面就来看看15/18位身份证号码验证的正则表达式吧. 介绍 xxxxxx yyyy MM d ...

  3. MySQL正则表达式判断身份证_15/18位身份证号码验证的正则表达式总结(详细版)...

    前言 开发过程中,常常需要对一些输入信息进行有效性验证,使用正则表达式进行校验是最简单.效率最高的方式了,下面就来看看15/18位身份证号码验证的正则表达式吧. 介绍 xxxxxx yyyy MM d ...

  4. python正则表达式 身份证_15/18位身份证号码验证的正则表达式总结(详细版)

    前言 开发过程中,常常需要对一些输入信息进行有效性验证,使用正则表达式进行校验是最简单.效率最高的方式了,下面就来看看15/18位身份证号码验证的正则表达式吧. 介绍 xxxxxx yyyy MM d ...

  5. Java 身份证号码验证工具类

    package cn.hlq.test;import java.text.ParseException; import java.text.SimpleDateFormat; import java. ...

  6. js正则表达式 - 验证11位手机号码、邮箱验证、18位身份证号码

    正则解析 11位手机号码 reg表达式:/^[1][3,4,5,7,8][0-9]{9}$/ 规则:第一个数字1,第二个数字只能是3,4,5,7,8中的某一个,剩下的号码需要有9个数,范围在0-9之间 ...

  7. 15位、18位身份证号码正则表达式

    身份证正则表达式 在项目中遇到身份证号码验证,百度了一些资料,太简单的和太复杂的pass,综合了一些案例,取长补短,形成了个折中版本的,正则表达式如下: var reg =/(^[1-9]\d{5}( ...

  8. java身份证号码校验工具类

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...

  9. java字符串应用之18位身份证格式验证

    公民身份号码是特征组合码,由17位数字本体码和1位数字校验码组成.排列顺序从左至右依次为:6位数字地址码.8位数字出生日期码,3位数字顺序码和1位数字校验码.     地址码:表示编码对象常住户口所在 ...

  10. 关于18位身份证号码最后一位计算(Java实现)

    关于18位身份证号码最后一位计算(Java实现) 现代的身份证号码长度都是18位的,但是只要知道前17位便可推出第18位数字或者字母(第18位为0,1,...,9和X中的一个).也就是说,国内不存在前 ...

最新文章

  1. python多线程端口扫描程序
  2. MySQL开启federated引擎实现数据库表映射
  3. Spring源码导入IDEA
  4. linux 修改时间的命令,Linux 常用命令(查看版本、修改系统时间)
  5. Nacos源码NacosAutoServiceRegistration
  6. 如何成为优秀的科学家
  7. 曝微软将发布基于 Excel 的低代码语言:Power Fx
  8. 惊艳!Uber 的豪华开源深度学习“全家桶”
  9. 2020计算机应用模拟题,2020年函授本科计算机应用基础课后作业、模拟题及答案...
  10. Java高并发-多线程基础
  11. matlab显示大图像
  12. Android系统开发篇(二) —— 建立Android系统开发环境之Ubuntu 20.04.4 LTS
  13. linux查询系统版本信息命令,命令查询windowsLinux系统版本信息
  14. 读书之乐 摘自《致青年朋友》
  15. 解决user installations are disabled via policy on the machine错误
  16. 一文读懂APS系统的核心算法和数学理论
  17. 春秋航空航班查询API
  18. 厦门商标注册网商标产权关系
  19. 【洛谷】P3386 【模板】二分图最大匹配
  20. PlayCanvas学习教程总结

热门文章

  1. 一款简单微信小程序个人博客。后端基于SpringBoot实现
  2. php 如何添加备案号,wordpress如何添加备案信息
  3. java ckfinder_java 使用ckfinder
  4. linux icmp 时间戳过滤,ICMP-linux c 时间戳请求功能实现
  5. 网络直播与营销“合二为一”
  6. 共享的计算机用户账户限制,win10系统使用共享功能被提示用户账户限制的方案...
  7. 读后感:救黑熊重要,还是救助失学儿童重要?
  8. WEBI上取月的整周
  9. 用c语言求20以内的勾股数,C语言求勾股数代码及解析
  10. 【华人学者风采】王亚军 微软必应