Java 从身份证号码中获取出生日期、性别、年龄(15位和18位)
生活随笔
收集整理的這篇文章主要介紹了
Java 从身份证号码中获取出生日期、性别、年龄(15位和18位)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
項目場景:
提示:這次做項目的時候遇到一個工具,整理出來以后可以直接使用
問題描述:給一個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位)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python:实现从rx网站刮取处方药的
- 下一篇: 开源数据大屏AJ-Report