项目场景:

提示:这次做项目的时候遇到一个工具,整理出来以后可以直接使用
问题描述:给一个String 类型的 身份证号码,需要从这串数字中获取出生日期、性别、年龄
身份证号码分为 15 位 和18 位。
从1985年,开始颁发第一代居民身份证,而第一代身份证就是15位。分别是6位行政区划代码+6位出生日期+3位顺序码
近年来,我国开始颁发第二代居民身份证,身份证号码由第一代的15升级到18位,这18位数字分别是6位行政区划代码+8位出生日期+3位顺序码+1位校验码


问题分析

  • 15位身份证号码:第7、8位为出生年份(两位数),第9、10位为出生月份,第11、12位代表出生日期,第15位代表性别,奇数为男,偶数为女。
  • 18位身份证号码:第7、8、9、10位为出生年份(四位数),第11、第12位为出生月份,第13、14位代表出生日期,第17位代表性别,奇数为男,偶数为女。

代码部分

前提是:身份证号码要正确(即校验码正确),所以调用 方法前要保证身份证号码正确

public class IdCardNumberMethod {/*** 获取出生日期** @return 返回字符串类型*/public String getBirthFromIdCard(String idCard) {if (idCard.length() != 18 && idCard.length() != 15) {return "请输入正确的身份证号码";}if (idCard.length() == 18) {String year = idCard.substring(6).substring(0, 4);// 得到年份String month = idCard.substring(10).substring(0, 2);// 得到月份String day = idCard.substring(12).substring(0, 2);// 得到日return (year + "-" + month + "-" + day);} else if (idCard.length() == 15) {String year = "19" + idCard.substring(6, 8);// 年份String month = idCard.substring(8, 10);// 月份String day = idCard.substring(10, 12);// 得到日return (year + "-" + month + "-" + day);}return null;}/*** 获取出生日期** @return 返回日期格式*/public Date getBirthDayFromIdCard(String idCard) throws ParseException {Date birth = null;if (idCard.length() == 18) {String year = idCard.substring(6).substring(0, 4);// 得到年份String month = idCard.substring(10).substring(0, 2);// 得到月份String day = idCard.substring(12).substring(0, 2);// 得到日SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");birth = format.parse(year + "-" + month + "-" + day);} else if (idCard.length() == 15) {String year = "19" + idCard.substring(6, 8);// 年份String month = idCard.substring(8, 10);// 月份String day = idCard.substring(10, 12);// 得到日SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");birth = format.parse(year + "-" + month + "-" + day);}return birth;}/*** 获取性别*         0=未知的性别,9=未说明的性别,2=女性,1=男性* @return int*/public int getSexFromIdCard(String idCard) {int sex = 9;// 身份证号码为空if (idCard == "" || idCard.length() <= 0){return sex = 0;}if (idCard.length() == 18) {if (Integer.parseInt(idCard.substring(16).substring(0, 1)) % 2 == 0) {// 判断性别sex = 2; // 女} else {sex = 1; // 男}} else if (idCard.length() == 15) {String usex = idCard.substring(14, 15);// 用户的性别if (Integer.parseInt(usex) % 2 == 0) {sex = 2; // 女} else {sex = 1; // 男}}return sex;}/*** 根据身份证的号码算出当前身份证持有者的年龄** @param* @throws Exception* @return  -1(表示异常) 0 (身份证号码为空)*/public int getAgeForIdcard(String idcard) {try {int age = 0;if (StringUtils.isEmpty(idcard)) {return age;}String birth = "";if (idcard.length() == 18) {birth = idcard.substring(6, 14);} else if (idcard.length() == 15) {birth = "19" + idcard.substring(6, 12);}int year = Integer.valueOf(birth.substring(0, 4));int month = Integer.valueOf(birth.substring(4, 6));int day = Integer.valueOf(birth.substring(6));Calendar cal = Calendar.getInstance();age = cal.get(Calendar.YEAR) - year;//周岁计算if (cal.get(Calendar.MONTH) < (month - 1) || (cal.get(Calendar.MONTH) == (month - 1) && cal.get(Calendar.DATE) < day)) {age--;}return age;} catch (Exception e) {e.getMessage();}return -1;}/*** 15 位身份证号码转 18 位* <p>* 15位身份证号码:第7、8位为出生年份(两位数),第9、10位为出生月份,第11、12位代表出生日期,第15位代表性别,奇数为男,偶数为女。* 18位身份证号码:第7、8、9、10位为出生年份(四位数),第11、第12位为出生月份,第13、14位代表出生日期,第17位代表性别,奇数为男,偶数为女。*/public StringBuffer IdCardMethod15To18(String idCard) {//将字符串转化为buffer进行操作StringBuffer stringBuffer = new StringBuffer(idCard);//身份证最后一位校验码,X代表10(顺序固定)char[] checkIndex = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};int sum = 0;//在第6位插入年份的前两位19stringBuffer.insert(6, "19");for (int i = 0; i < stringBuffer.length(); i++) {char c = stringBuffer.charAt(i);//前17位数字int ai = Integer.valueOf(String.valueOf(c));//前17位每位对应的系数(7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 )int wi = ((int) Math.pow(2, stringBuffer.length() - i)) % 11;//总和(每位数字乘以系数再相加)sum = sum + ai * wi;}//总和除以11求余int indexOf = sum % 11;//根据余数作为下表在校验码数组里取值stringBuffer.append(checkIndex[indexOf]);return stringBuffer;}}

**2022年12月16日 ~~**

时隔多日,补充一下身份证号的校验,15位和18位都可以进行

/*** 身份证号码验证** @param idCard* @return*/public static boolean validateIdCard(String idCard) throws Exception {if (idCard == null || "".equals(idCard)) {throw new Exception("身份证号码为空");}if (idCard.length() != 18 && idCard.length() != 15) {throw new Exception("身份证号码长度不正确");}// 定义判别用户身份证号的正则表达式(15位或者18位,最后一位可以为字母)String regularExpression ="(^[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}$)";boolean matches = idCard.matches(regularExpression);// 判断第18位校验值if (matches) {if (idCard.length() == 18) {try {char[] charArray = 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 sum = 0;for (int i = 0; i < idCardWi.length; i++) {int current = Integer.parseInt(String.valueOf(charArray[i]));int count = current * idCardWi[i];sum += count;}char idCardLast = charArray[17];int idCardMod = sum % 11;if (idCardY[idCardMod].toUpperCase().equals(String.valueOf(idCardLast).toUpperCase())) {return true;} else {return false;}} catch (Exception e) {e.printStackTrace();return false;}}if (idCard.length() == 15) {validateIdCard(String.valueOf(idCardMethod15To18(idCard)));}}return matches;}

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

  1. python输入身份证号得到出生日期_初学django1:django模型中自定义方法从身份证号码中获取出生日期...

    有一个Person的Model,里面用到了身份证.出生日期字段.要求如下: 在存入的时候对身份证号码进行校验. 自动从身份证号码中获取出生日期. 因为初学,不知道如何插入自定义校验,就在Model.p ...

  2. Excel 从身份证号码上获取出生日期和年龄

    1.从身份证中获取年月日 =TEXT(MID(A2,7,6+(LEN(A2)=18)*2),"0-00-00") 2.从身份证中获取年龄 =DATEDIF(TEXT(MID(A1, ...

  3. java根据身份证号码得到生日和性别

    java根据身份证号码得到生日和性别 IDCards工具类 执行结果 IDCards工具类 package com.liantuo.finance.utils;//身份证工具类 public clas ...

  4. excel从身份证号码中获取邮编信息?

    今天跟大家分享一下excel从身份证号码中获取邮编信息? 1.打开excel身份证号码文件,现在要求我们快速根据身份证号码提取邮编信息. 2.首先我们选中身份证号码单元格,点击[DIY工具箱]选项卡 ...

  5. 如何从Excel单元格的身份证号码中提取出生日期、性别

    从身份证号码中提取出生年月.性别需要使用到字符串截取函数MID(),取余函数MOD()和条件函数IF() 一.提取出生日期 在需要录入出生日期的单元格输入=MID(A1,7, 8)回车即可,函数自动会 ...

  6. java从身份证号码中提取出生年月日

    前言 给一个String 类型的 身份证号码,需要从这串数字中获取出生日期.性别.年龄 一.问题描述: 给一个String 类型的 身份证号码,需要从这串数字中获取出生日期.性别.年龄.身份证号码分为 ...

  7. mysql获取18位和15位身份证号中的出生日期、年龄

    18位身份证号码 select cast(substring(idno,7,8) as date) as 出生日期,2022-substring(idno,7,4) as age from table ...

  8. 如何用函数求出身份证号码中的出生日期——CONCATENATE、MID函数的使用方法

    CONCATENATE函数: 主要功能:可以将多个字符串合并成一个字符串. 格式参数说明:CONCATENATE(Text1, Text2,Text3,-) 使用例子:若"Text1&quo ...

  9. Python 从身份证中提取出生日期/性别/年龄/生肖/星座/省份/城市/城市等级/区县(2019划分标准)

    写在前面 用python实现快速从身份证中explore尽量多的的信息,找了很多资料,发现并不全.参考已有的分享和其他信息自己写了. 能提取的信息: 出生日期.年龄.生肖.星座.省份.城市.区县.归属 ...

最新文章

  1. 【RocketMQ工作原理】indexFile
  2. 第十六届智能车竞赛参赛队伍提问-6-11
  3. html src 图片不显示图片,css中不用src也让图片显示的方法是什么?
  4. 存在于实数域无限维空间的分子
  5. java iconsolefactory_java – 如何设置IOConsole的Caret
  6. 学习笔记-----fputs与printf
  7. 项目集成Spring Security
  8. 基于javaweb SSM邮件收发信息系统设计和实现以及文档
  9. php include的路径问题,php7中include有相对路径无法打开
  10. Git:撤销回滚操作
  11. python无法启动此程序因为_python报错:无法启动此程序,因为计算机中丢失
  12. 数字化营销服务-如何进行数字化营销?
  13. Word怎么显示目录
  14. css将商品加入购物车,vue实现点击商品加入购物车动画
  15. Xcode Undefined symbols 错误
  16. html5 plus 保存图片,H5+app点击图片保存到相册
  17. e4a浏览框本地HTML,E4A浏览器
  18. endnote添加引文格式
  19. 38. OP-TEE中secure stroage------安全文件数据格式和操作过程
  20. Websocket(二)-客户端与服务器通信

热门文章

  1. 保时捷卡宴加装电动踏板,原来好处这么多!
  2. 基于华大的HC32F005 的高压三相无刷电机驱动方案
  3. 传统音乐与电子音乐在作曲上的区别
  4. matlab实验word,结合MATLAB的控制工程实验word版
  5. java.lang.IllegalStateException错误
  6. IoT—物联网通信协议解析
  7. 架构师学习笔记14--信息系统基础知识
  8. Camtasia studio编辑、合成视频和音频——自用
  9. 在数智化时代,寻找发光的你!——2022大数据能力提升项目宣讲会成功举行
  10. 分享:我的.Net武器库 ------ 新.Net架构必备工具列表