前言

给一个String 类型的 身份证号码,需要从这串数字中获取出生日期、性别、年龄


一、问题描述

给一个String 类型的 身份证号码,需要从这串数字中获取出生日期、性别、年龄。身份证号码分为 15 位 和18 位

二、代码部分

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;}}

三、补充一下身份证号的校验,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从身份证号码中提取出生年月日相关推荐

  1. 【Mac版excel快捷键Control+E实用技巧2】excel如何快速从身份证号中提取出生年月日?

    Mac版excel如何快速从身份证号中提取出生年月日? 我们可以手动将出生年月复制粘贴,但是,如果有几十几百个出生年月需要从身份证号中提取出来呢? 如今,Excel在我们生活和工作中的地位越来越重要, ...

  2. java 身份证地址提取籍贯_从身份证号码中提取信息,这些方法请收好

    小伙伴们好啊,今天老祝为大家准备了一组和身份证有关的函数公式,看看如何从身份证号码中提取出需要的信息. 如下图为所示,是一份模拟的员工信息表,A列是姓名,B列是身份证号码,C列是职级. ★ 首先咱们来 ...

  3. 7-27 从身份证号码中提取出出生年月 (12point(s))

    7-27 从身份证号码中提取出出生年月 (12point(s)) 输入一个18位的身份证号码,提取出年份和月份并输出,请判断输入的号码是否是18位,如果不是请提示"Invalid data, ...

  4. 如何快速从身份证号码中提取周岁?

    今天跟大家分享一下如何快速从身份证号码中提取周岁? 1.点击[DIY工具箱] 2.点击[身份证]选择[提取年龄] 3.勾选[年龄]并设置为[周岁],然后点击[确定] ​ 4.最后我们选择一个合适的保存 ...

  5. excel如何从身份证号码中提取虚岁?

    1.打开演示文件要求从身份证号码中提取虚岁. 2.首先我们选中身份证号码单元格区域 3.然后我们点击[diy工具箱] ​ 4.点击[身份证]然后选择[提取年龄] 5.选择[虚岁],接着我们点击[确定] ...

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

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

  7. Java验证身份证号码及提取生日信息

    Java学习第一站,导师给布置的作业题,验证身份证号码的合法性并提取生日信息.第一次写Java代码,第一次用博客记录学习进程,略紧张,对Java变量的命名还停留在C++的命名法阶段,吼吼~~现在开始正 ...

  8. Java从身份证号码,提取用户的出生年月日,输出用户的生日信息。

    import java.util.Calendar; import java.util.Scanner;/*** 根据用户输入的身份证号码,从字符串中提取用户的出生年月日,输出用户的生日信息.要求:身 ...

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

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

最新文章

  1. linux中搭建vue-cli
  2. opcuaclient 文档_连接协议-OPC UA Client
  3. Maven入门指南② :Maven 常用命令,手动创建第一个 Maven 项目
  4. c均值算法的设计与实现_如何使用C链表实现 LRU 算法
  5. python 碎片整理 threading模块小计
  6. AI一周热闻:北大建立人工智能新校区;英国首例机器人心脏手术致死
  7. Tricks(十八)—— 转置 list of lists
  8. 新书推荐 | Java核心技术卷Ⅰ:基础知识(原书第11版)
  9. 机器学习(ML)在材料领域应用专题
  10. 雷达原理(第五版)常见公式
  11. 海康(hikvision)录像机添加萤石(ezviz)摄像机常见问题(转)
  12. 【数字信号处理】基于DFT的滤波系列4之加窗(含MATLAB代码)
  13. leetcode_83_Remove Duplicates from Sorted List
  14. 部署LAMP平台,构建企业web服务器
  15. P1551 亲戚(并查集)
  16. 移动周刊第 188 期:Android 安全性要点与规范核心详析
  17. 8CollapsingToolbarLayout源码分析
  18. 【科普】你知道腾讯的技术职级吗?
  19. 设计模式——行为型模式之责任链模式(简简单单入门责任链,理解I/O流消息怎么逐步传递处理以及服务器框架转发)
  20. SaaS服务模式下的电商ERP遇到企业仓库分布于多组织下的管理

热门文章

  1. 为什么上班的时候基本上都是坐着,但是还是感觉很累?
  2. python设计查询余额程序_python实现监控阿里云账户余额功能
  3. RabbitMQ吐血总结(2)---高级特性总结
  4. flac与ape格式
  5. indesign 显示黑屏_indesign技巧
  6. 传智播客设计学院主页学习案例——HTML,CSS,JS代码学习案例
  7. python股票量化交易(9)---使用TA-Lib库实现股价走势对比图
  8. 无法找到来自源 Netwtw10 的事件 ID 6062 的描述本地计算机上未安装引发此事件的组件,或者安装已损坏。可以安装或修复本地计算机上的组件。
  9. android manager provider模式,安卓情景模式开发(一)-控制GPS/WIFI/蓝牙/飞行模式...
  10. 如何使用支付宝api接入自己的网站