Java实现身份证的校验
package com.liu.susu.message.utils;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class IdCardCheckUtil {
private static int[] weightCode = new int[17];
private static final String[] CHECK_CODE = {"1","0","X","9","8","7","6","5","4","3","2"};
private static final int DIVIDER = 11;
private static final int AREA_NUMBER = 6;
private static final String YEAR_PREFIX = "19";
private static final int OLD_ID_CARD_LENGTH = 15;
private static final int NEW_ID_CARD_LENGTH = 18;
static {
setWiBuffer();
}
private static void setWiBuffer() {
for (int i = 0; i < weightCode.length; i++) {
int k = (int) Math.pow(2, (weightCode.length - i));
weightCode[i] = (k % DIVIDER);
}
}
public static boolean checkIdCardProc(final String idCard) {
if (checkLengthAndBirthday(idCard)) {
return idCard.length() == OLD_ID_CARD_LENGTH ? true : checkIdCard18(idCard);
}
return false;
}
private static boolean checkLengthAndBirthday(final String idCard) {
if ((idCard.length() == OLD_ID_CARD_LENGTH) || (idCard.length() == NEW_ID_CARD_LENGTH)) {
return regexCheckAndCheckBirthday(idCard);
}
return false;
}
private static boolean regexCheckAndCheckBirthday(final String idCard) {
String birthday = "";
if (idCard.length() == OLD_ID_CARD_LENGTH) {
if (idCard15RegexCheck(idCard)) {
birthday = YEAR_PREFIX + idCard.substring(AREA_NUMBER, AREA_NUMBER + 6);
}
} else {
if (idCard18RegexCheck(idCard)) {
birthday = idCard.substring(AREA_NUMBER, AREA_NUMBER + 8);
}
}
System.out.println("birthday->" + birthday);
return checkStrDate(birthday);
}
public static boolean checkIdCard18(final String idCard) {
int dividedResult = getDividedResult(idCard);
String code = CHECK_CODE[dividedResult];
String lastStr = idCard.substring(idCard.length() - 1);
if (code.equals(lastStr)) {
return true;
}
return false;
}
public static int getDividedResult(String idCard) {
String[] idCardNum = idCard.substring(0, 17).split("");
int sum = 0;
for (int i = 0; i < idCardNum.length; i++) {
sum += Integer.parseInt(idCardNum[i]) * weightCode[i];
}
return sum % DIVIDER;
}
private static boolean idCard15RegexCheck(String idCard) {
String reg = "^(\\d{8}(0[1-9]|1[012])(0[1-9]|[12]\\d|3[01])\\d{3})$";
Pattern pattern = Pattern.compile(reg);
Matcher m = pattern.matcher(idCard);
return (m.matches()) ? true : false;
}
private static boolean idCard18RegexCheck(String idCard) {
String reg = "^(\\d{6}(18|19|20)\\d{2}(0[1-9]|1[012])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|X|x))$";
Pattern pattern = Pattern.compile(reg);
Matcher m = pattern.matcher(idCard);
return (m.matches()) ? true : false;
}
private static boolean checkStrDate(final String strDate) {
try {
LocalDate.parse(strDate, DateTimeFormatter.ofPattern("yyyyMMdd"));
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public static void main(String[] args) {
String id2 = "XXXX";
boolean b2 = checkIdCardProc(id2);
System.out.println(b2);
}
}