前言
給一個String 類型的 身份證號碼,需要從這串數(shù)字中獲取出生日期、性別、年齡文章來源地址http://www.zghlxwxcb.cn/news/detail-617756.html
一、問題描述:
????????給一個String 類型的 身份證號碼,需要從這串數(shù)字中獲取出生日期、性別、年齡。身份證號碼分為 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;
}
/**
* 根據(jù)身份證的號碼算出當前身份證持有者的年齡
*
* @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 位身份證號碼轉(zhuǎn) 18 位
* <p>
* 15位身份證號碼:第7、8位為出生年份(兩位數(shù)),第9、10位為出生月份,第11、12位代表出生日期,第15位代表性別,奇數(shù)為男,偶數(shù)為女。
* 18位身份證號碼:第7、8、9、10位為出生年份(四位數(shù)),第11、第12位為出生月份,第13、14位代表出生日期,第17位代表性別,奇數(shù)為男,偶數(shù)為女。
*/
public StringBuffer IdCardMethod15To18(String idCard) {
//將字符串轉(zhuǎn)化為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位插入年份的前兩位19
stringBuffer.insert(6, "19");
for (int i = 0; i < stringBuffer.length(); i++) {
char c = stringBuffer.charAt(i);
//前17位數(shù)字
int ai = Integer.valueOf(String.valueOf(c));
//前17位每位對應(yīng)的系數(shù)(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;
//總和(每位數(shù)字乘以系數(shù)再相加)
sum = sum + ai * wi;
}
//總和除以11求余
int indexOf = sum % 11;
//根據(jù)余數(shù)作為下表在校驗碼數(shù)組里取值
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();
// 前十七位加權(quán)因子
int[] idCardWi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
// 這是除以11后,可能產(chǎn)生的11位余數(shù)對應(yīng)的驗證碼
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;
}
文章來源:http://www.zghlxwxcb.cn/news/detail-617756.html
到了這里,關(guān)于java從身份證號碼中提取出生年月日的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!