这里写目录

  • 身份证号编码规则
  • 身份证号脱敏
  • 身份证号合法性校验
  • 根据身份证号获取年龄
  • 根据生日日期获取年龄
  • 根据身份证号获取年龄、生日的Map集合

身份证号编码规则

第一、二位表示省(自治区、直辖市、特别行政区)。
第三、四位表示市(地级市、自治州、盟及国家直辖市所属市辖区和县的汇总码)。其中,01-20,51-70表示省直辖市;21-50表示地区(自治州、盟)。
第五、六位表示县(市辖区、县级市、旗)。01-18表示市辖区或地区(自治州、盟)辖县级市;21-80表示县(旗);81-99表示省直辖县级市。
第七、十四位表示出生年月日(单数字月日左侧用0补齐)。其中年份用四位数字表示,年、月、日之间不用分隔符。例如:1981年05月11日就用19810511表示。
第十五、十七位表示顺序码。对同地区、同年、月、日出生的人员编定的顺序号。其中第十七位奇数分给男性,偶数分给女性。
第十八位表示校验码。作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,校验码如果出现数字10,就用X(罗马字符)来代替。

  • 15位:6位地址码+6位出生年月日(900101代表1990年1月1日出生)+3位顺序码
  • 18位:6位地址码+8位出生年月日(19900101代表1990年1月1日出生)+3位顺序码+1位校验码

身份证号脱敏

/*** 身份证号脱敏* 保留前六后三, 适用于15位和18位身份证号** @param idCard* @return String**/
public static String desensitizedIdCard(String idCard){if (StringUtils.isNotBlank(idCard)) {if (idCard.length() == 15){idCard = idCard.replaceAll("(\\w{6})\\w*(\\w{3})", "$1******$2");}if (idCard.length() == 18){idCard = idCard.replaceAll("(\\w{6})\\w*(\\w{3})", "$1*********$2");}}return idCard;
}

身份证号合法性校验

/*** 身份证号合法性校验** @param idCard* @return String*/
public static boolean isLegalIDCard(String idCard) {boolean res = false;// 校验规则(15或是18位身份证号码)if (isMatches(idCard)) {if (idCard.length() == 18) {char[] idCardArray = idCard.toCharArray();// 前十七位加权因子int[] idCardWi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};// 除以11后,可能产生的11位余数对应的验证码String[] idCardY = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};int total = 0;for (int i = 0; i < idCardWi.length; i++) {int count = Integer.parseInt(String.valueOf(idCardArray[i])) * idCardWi[i];total += count;}// 最后一位校验码int idCardModify = total % 11;if (idCardY[idCardModify].toUpperCase().equals(String.valueOf(idCardArray[17]).toUpperCase())) {res = true;} else {System.out.println(idCardY[idCardModify].toUpperCase());res = false;}} else {res = true;}}return res;
}private static boolean isMatches(String idCard) {if (StringUtils.isBlank(idCard)) {return false;}String regex = "(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|"+ "(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}$)";return idCard.matches(regex);
}

根据身份证号获取年龄

/*** 根据身份证号获取年龄** @param idCard* @return Integer*/public static Integer getAgeByIdCard(String idCard) {boolean legalIDCard = isLegalIDCard(idCard);if (!legalIDCard) return null;Integer age = null;int year = Calendar.getInstance().get(Calendar.YEAR);if (idCard.length() == 15) {age = (year - Integer.parseInt("19" + idCard.substring(6, 8)));} else if (idCard.length() == 18) {age = (year - Integer.parseInt(idCard.substring(6, 10)));}return age;}

根据生日日期获取年龄

根据生日当天为分界线来计算年龄。

private static int getAgeByBirthday(LocalDate birthday) {int age = 0;try {Calendar now = Calendar.getInstance();now.setTime(new Date());// 当前时间now.setTimeInMillis(LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli());Calendar birth = Calendar.getInstance();birth.setTimeInMillis(birthday.atStartOfDay().toInstant(ZoneOffset.of("+8")).toEpochMilli());if (birth.after(now)) {// 如果传入的时间,在当前时间的后面,返回0岁age = 0;} else {age = now.get(Calendar.YEAR) - birth.get(Calendar.YEAR) - 1;if (now.get(Calendar.MONTH) >= birth.get(Calendar.MONTH)) {if (now.get(Calendar.DAY_OF_MONTH) >= birth.get(Calendar.DAY_OF_MONTH)) {age += 1;}}}return age;} catch (Exception e) {return 0;}
}

根据身份证号获取年龄、生日的Map集合

/*** 根据身份证号获取年龄、生日的Map集合** @param idCard* @return Map<String, Object>* @author wanglingqiang*/public static Map<String, Object> getAgeBirthDayByIdCard(String idCard) {Map<String, Object> result = Maps.newHashMap();if (!isMatches(idCard)) return result;String birthdayStr = idCard.substring(6, 14);LocalDate birthday = LocalDate.parse(birthdayStr, DateTimeFormatter.ofPattern(Constants.SMALL_DATE_FORMAT));int age = getAgeByBirthday(birthday);result.put("age", age);result.put("birthday", birthday);return result;}private static boolean isMatches(String idCard) {//上面写了
}private static int getAgeByBirthday(LocalDate birthday) {//上面写了
}

Java身份证号脱敏、校验身份证号合法性、根据身份证号获取年龄、根据生日获取年龄相关推荐

  1. 前端——使用JavaScript(jQuery)通过身份证号获取籍贯、生日、年龄、性别

    注:本文所用的身份证号码是18位号码,15位的号码类似 tips: 公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成. 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位 ...

  2. 身份证号脱敏处理,各页面的身份证号隐藏11-16位

    解决思路:正则匹配 身份证 从前几个字符,到后几个字符,中间的全部替换为 ****** let str = "331082199611095387"; str = str.repl ...

  3. Excel表格中根据身份证号获取出生日期、生日、年龄、性别、工龄、退休龄

    ( 1 ) 15 位的身份证号码: 1~6 位为地区代码, 7~8 位为出生年份 (2 位 ) , 9~10 位为出生月份, 11~12 位为出生日期,第 13~15 位为顺序号,并能够判断性别,奇数 ...

  4. php 正则快递单号,正则表达式校验百世快递运单号

    百世快递运单号规则 第一种:一位字母+12位数字,字母只能是ABDESs中的一个 第二种:BXA+10位数字 第三种:K8+11位数字 第四种:000+10位数字,三个数字0 . 第五种:02+11位 ...

  5. Python编程100例--身份证号码的校验码

    身份证号码的校验码 任务描述: 身份证号码是由17位数字本体码和1位数字校验码组成,具有特定含义: 前6位是省市县行政区划分代码:第7-14位为出生年月日:第15-17位为登记流水号,其中第17位为偶 ...

  6. java 手机号脱敏,身份证号脱敏 工具类

    java 手机号脱敏,身份证号脱敏 工具类 import org.apache.commons.lang3.StringUtils;/*** * @title: 脱敏工具类* @author: wll ...

  7. Java实现对手机号、身份证号、护照号脱敏

    目录 1.Java原生代码实现: 2.使用 Hutool 工具实现: 背景: 我们在项目中经常会需要用到用户的敏感信息,比如手机号.身份证号.护照号: 当数据需要在页面上进行展示的时候就需要进行脱敏, ...

  8. SpringBoot自定义注解实现身份证号格式校验

    背景 ​ 身份证的组成部分较为复杂, 如果仅使用正则表达式的话, 有些情况也无法校验出来, 例如正确的证件号为513334200310119074, 如果把最后一位变成9, 则是一个错误的证件号, 但 ...

  9. 身份证、手机号、邮箱、银行卡、企业税号等正则校验

    身份证号正则校验: 前6位 第一位1到9范围 后5位 数字 /^[1-9]\d{5}/ 年份4位 开头两位 18 or 19 or 20 后面2位数字 /(18|19|20)\d{2}/ 月份2位 1 ...

最新文章

  1. 791. Custom Sort String
  2. NanoPi NEO Air使用八:编写个简单的驱动和应用程序
  3. Android screencap截屏指令
  4. android_ExpandableListView 下拉列表使用
  5. Java 并发——多线程基础
  6. c# ioc 单例模式_Spring-IOC
  7. 忍辱负重的小白兔们 - 验收准则的意义
  8. C语言面试题分享(5)
  9. 哪种人是软件设计中的稀缺型人才?
  10. ArcGIS API for JavaScript——绘制工具(Draw)
  11. 计算机键盘正确指法操作方法,键盘指法,图文详解键盘指法练习方法
  12. 机器翻译是否能替代人工翻译?从前世今生说起
  13. 以太坊项目代码贡献排名
  14. linux访问局域网共享,精解局域网访问及共享(三)
  15. 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数001·3D函数
  16. 浅谈R语言基于ARCH模型股价波动率建模
  17. huffman python,哈夫曼(Huffman)编码python代码实现
  18. 主机升级rsyslog后服务异常分析,rsyslog服务重启报错
  19. 桌面上的Internet explorer图标删不掉
  20. android 唱歌评分系统,抖音上唱歌评分的软件叫什么 可以评分的唱歌软件推荐

热门文章

  1. 【Linux】Centos 7.9 新机器的一般部署方案
  2. CC协议是怎么一回事?
  3. javaMail学习(四)——使用javaMail给网易账户发简单邮件
  4. 网易游戏研发工程师实习生(客户端方向)一面
  5. JavaScript常见输出语句
  6. 基于HTML/CSS/JS的年龄计算器 | 带有免费源码
  7. The Killer
  8. 信息系统项目管理师必背核心考点(三十三)老七工具
  9. aire 计算机术语,法语计算机及网络词汇(5)
  10. 基于 HTML5 的画图工具【100010240】