JAVA:18位身份证号码验证工具类(识别性别和生日、计算年龄)
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位身份证号码验证工具类(识别性别和生日、计算年龄)相关推荐
- 15/18位身份证号码验证
15/18位身份证号码验证 在做身份证验证之前你得明确身份证号的组成. 首先我告诉你,18位身份证号码后面的字母只有"X"这一个.(X是罗马数字的10,用X来代替10,可以保证您的 ...
- 15/18位身份证号码验证的正则表达式总结(详细版)
前言 开发过程中,常常需要对一些输入信息进行有效性验证,使用正则表达式进行校验是最简单.效率最高的方式了,下面就来看看15/18位身份证号码验证的正则表达式吧. 介绍 xxxxxx yyyy MM d ...
- MySQL正则表达式判断身份证_15/18位身份证号码验证的正则表达式总结(详细版)...
前言 开发过程中,常常需要对一些输入信息进行有效性验证,使用正则表达式进行校验是最简单.效率最高的方式了,下面就来看看15/18位身份证号码验证的正则表达式吧. 介绍 xxxxxx yyyy MM d ...
- python正则表达式 身份证_15/18位身份证号码验证的正则表达式总结(详细版)
前言 开发过程中,常常需要对一些输入信息进行有效性验证,使用正则表达式进行校验是最简单.效率最高的方式了,下面就来看看15/18位身份证号码验证的正则表达式吧. 介绍 xxxxxx yyyy MM d ...
- Java 身份证号码验证工具类
package cn.hlq.test;import java.text.ParseException; import java.text.SimpleDateFormat; import java. ...
- js正则表达式 - 验证11位手机号码、邮箱验证、18位身份证号码
正则解析 11位手机号码 reg表达式:/^[1][3,4,5,7,8][0-9]{9}$/ 规则:第一个数字1,第二个数字只能是3,4,5,7,8中的某一个,剩下的号码需要有9个数,范围在0-9之间 ...
- 15位、18位身份证号码正则表达式
身份证正则表达式 在项目中遇到身份证号码验证,百度了一些资料,太简单的和太复杂的pass,综合了一些案例,取长补短,形成了个折中版本的,正则表达式如下: var reg =/(^[1-9]\d{5}( ...
- java身份证号码校验工具类
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...
- java字符串应用之18位身份证格式验证
公民身份号码是特征组合码,由17位数字本体码和1位数字校验码组成.排列顺序从左至右依次为:6位数字地址码.8位数字出生日期码,3位数字顺序码和1位数字校验码. 地址码:表示编码对象常住户口所在 ...
- 关于18位身份证号码最后一位计算(Java实现)
关于18位身份证号码最后一位计算(Java实现) 现代的身份证号码长度都是18位的,但是只要知道前17位便可推出第18位数字或者字母(第18位为0,1,...,9和X中的一个).也就是说,国内不存在前 ...
最新文章
- python多线程端口扫描程序
- MySQL开启federated引擎实现数据库表映射
- Spring源码导入IDEA
- linux 修改时间的命令,Linux 常用命令(查看版本、修改系统时间)
- Nacos源码NacosAutoServiceRegistration
- 如何成为优秀的科学家
- 曝微软将发布基于 Excel 的低代码语言:Power Fx
- 惊艳!Uber 的豪华开源深度学习“全家桶”
- 2020计算机应用模拟题,2020年函授本科计算机应用基础课后作业、模拟题及答案...
- Java高并发-多线程基础
- matlab显示大图像
- Android系统开发篇(二) —— 建立Android系统开发环境之Ubuntu 20.04.4 LTS
- linux查询系统版本信息命令,命令查询windowsLinux系统版本信息
- 读书之乐 摘自《致青年朋友》
- 解决user installations are disabled via policy on the machine错误
- 一文读懂APS系统的核心算法和数学理论
- 春秋航空航班查询API
- 厦门商标注册网商标产权关系
- 【洛谷】P3386 【模板】二分图最大匹配
- PlayCanvas学习教程总结
热门文章
- 一款简单微信小程序个人博客。后端基于SpringBoot实现
- php 如何添加备案号,wordpress如何添加备案信息
- java ckfinder_java 使用ckfinder
- linux icmp 时间戳过滤,ICMP-linux c 时间戳请求功能实现
- 网络直播与营销“合二为一”
- 共享的计算机用户账户限制,win10系统使用共享功能被提示用户账户限制的方案...
- 读后感:救黑熊重要,还是救助失学儿童重要?
- WEBI上取月的整周
- 用c语言求20以内的勾股数,C语言求勾股数代码及解析
- 【华人学者风采】王亚军 微软必应