身份证验证
package com.ngupcc.commons.util;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.regex.Pattern;
public class IDCardUtils {
private static Pattern pattern = Pattern.compile("^\\d{17}[\\d|X]$");
private static final String CITY_CODE[] = {
"11", "12", "13", "14", "15", "21", "22", "23", "31", "32", "33", "34", "35", "36", "37", "41",
"42", "43", "44", "45", "46", "50", "51", "52", "53", "54", "61", "62", "63", "64", "65", "71",
"81", "82", "91"
};
private static final int POWER[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
private static final String VERIFY_CODE[] = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
public static boolean verify(String idno){
if(idno == null || !pattern.matcher(idno = idno.toUpperCase()).matches()){
return false;
}
if(Arrays.binarySearch(CITY_CODE, idno.substring(0, 2)) == -1){
return false;
}
String birthday = idno.substring(6, 14);
Date realBirthday = toBirthDay(birthday);
if(realBirthday == null || !birthday.equals(new SimpleDateFormat("yyyyMMdd").format(realBirthday))){
return false;
}
String verifyCode = VERIFY_CODE[getPowerSum(idno) % 11];
if(!verifyCode.equals(idno.substring(17, 18))){
return false;
}
return true;
}
private static int getPowerSum(String idno){
int sum = 0;
char[] fix17 = idno.substring(0, 17).toCharArray();
for(int i = 0 ; i <= 16 ; i++){
sum += (Integer.parseInt(fix17[i] + "") * POWER[i]);
}
return sum;
}
private static Date toBirthDay(String birthday){
try{
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, Integer.parseInt(birthday.substring(0, 4)));
calendar.set(Calendar.MONTH, Integer.parseInt(birthday.substring(4, 6)) - 1);
calendar.set(Calendar.DAY_OF_MONTH, Integer.parseInt(birthday.substring(6, 8)));
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTime();
}catch (Exception e){
return null;
}
}
public static Date getBirthDay(String idno){
if(!verify(idno)){
return null;
}
return toBirthDay(idno.substring(6, 14));
}
public static int getGender(String idno){
if(!verify(idno)){
return 0;
}
return (Integer.parseInt(idno.substring(16, 17)) % 2) == 0 ? 2 : 1;
}
}