java身份证合法性校验并提取身份证有效信息
java身份证合法性校验并获取身份证号有效信息,供大家参考,具体内容如下
java身份证合法性校验
/**身份证前6位【ABCDEF】为行政区划数字代码(简称数字码)说明(参考《GB/T2260-2007中华人民共和国行政区划代码》):
*该数字码的编制原则和结构分析,它采用三层六位层次码结构,按层次分别表示我国各省(自治区,直辖市,特别行政区)、
*市(地区,自治州,盟)、县(自治县、县级市、旗、自治旗、市辖区、林区、特区)。
数字码码位结构从左至右的含义是:
第一层为AB两位代码表示省、自治区、直辖市、特别行政区;
第二层为CD两位代码表示市、地区、自治州、盟、直辖市所辖市辖区、县汇总码、省(自治区)直辖县级行政区划汇总码,其中:
——01~20、51~70表示市,01、02还用于表示直辖市所辖市辖区、县汇总码;
——21~50表示地区、自治州、盟;
——90表示省(自治区)直辖县级行政区划汇总码。
第三层为EF两位表示县、自治县、县级市、旗、自治旗、市辖区、林区、特区,其中:
——01~20表示市辖区、地区(自治州、盟)辖县级市、市辖特区以及省(自治区)直辖县级行政区划中的县级市,01通常表示辖区汇总码;
——21~80表示县、自治县、旗、自治旗、林区、地区辖特区;
——81~99表示省(自治区)辖县级市。
*/
importjava.text.ParseException;
importjava.text.SimpleDateFormat;
importjava.util.Calendar;
importjava.util.Date;
importjava.util.GregorianCalendar;
importjava.util.HashMap;
importjava.util.Map;
importjava.util.regex.Pattern;
/**
*<p>
*类说明:身份证合法性校验
*</p>
*<p>
*--15位身份证号码:第7、8位为出生年份(两位数),第9、10位为出生月份,第11、12位代表出生日期,第15位代表性别,奇数为男,偶数为女。
*--18位身份证号码
*:第7、8、9、10位为出生年份(四位数),第11、第12位为出生月份,第13、14位代表出生日期,第17位代表性别,奇数为男,偶数为女。
*</p>
*/
@SuppressWarnings({"unchecked","unused","all"})
publicclassIdcardValidator{
/**
*省,直辖市代码表:{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:"国外"}
*/
protectedStringcodeAndCity[][]={{"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","国外"}};
privateStringcityCode[]={"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"};
//每位加权因子
privateintpower[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
//第18位校检码
privateStringverifyCode[]={"1","0","X","9","8","7","6","5",
"4","3","2"};
/**
*验证所有的身份证的合法性
*
*@paramidcard
*@return
*/
publicbooleanisValidatedAllIdcard(Stringidcard){
if(idcard.length()==15){
idcard=this.convertIdcarBy15bit(idcard);
}
returnthis.isValidate18Idcard(idcard);
}
/**
*<p>
*判断18位身份证的合法性
*</p>
*根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。
*排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
*<p>
*顺序码:表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
*</p>
*<p>
*1.前1、2位数字表示:所在省份的代码;2.第3、4位数字表示:所在城市的代码;3.第5、6位数字表示:所在区县的代码;
*4.第7~14位数字表示:出生年、月、日;5.第15、16位数字表示:所在地的派出所的代码;
*6.第17位数字表示性别:奇数表示男性,偶数表示女性;
*7.第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生,用来检验身份证的正确性。校检码可以是0~9的数字,有时也用x表示。
*</p>
*<p>
*第十八位数字(校验码)的计算方法为:1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7910584
*216379105842
*</p>
*<p>
*2.将这17位数字和系数相乘的结果相加。
*</p>
*<p>
*3.用加出来和除以11,看余数是多少?
*</p>
*4.余数只可能有012345678910这11个数字。其分别对应的最后一位身份证的号码为10X9876543
*2。
*<p>
*5.通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。
*</p>
*
*@paramidcard
*@return
*/
publicbooleanisValidate18Idcard(Stringidcard){
//非18位为假
if(idcard.length()!=18){
returnfalse;
}
//获取前17位
Stringidcard17=idcard.substring(0,17);
//获取第18位
Stringidcard18Code=idcard.substring(17,18);
charc[]=null;
StringcheckCode="";
//是否都为数字
if(isDigital(idcard17)){
c=idcard17.toCharArray();
}else{
returnfalse;
}
if(null!=c){
intbit[]=newint[idcard17.length()];
bit=converCharToInt(c);
intsum17=0;
sum17=getPowerSum(bit);
//将和值与11取模得到余数进行校验码判断
checkCode=getCheckCodeBySum(sum17);
if(null==checkCode){
returnfalse;
}
//将身份证的第18位与算出来的校码进行匹配,不相等就为假
if(!idcard18Code.equalsIgnoreCase(checkCode)){
returnfalse;
}
}
returntrue;
}
/**
*验证15位身份证的合法性,该方法验证不准确,最好是将15转为18位后再判断,该类中已提供。
*
*@paramidcard
*@return
*/
publicbooleanisValidate15Idcard(Stringidcard){
//非15位为假
if(idcard.length()!=15){
returnfalse;
}
//是否全都为数字
if(isDigital(idcard)){
Stringprovinceid=idcard.substring(0,2);
Stringbirthday=idcard.substring(6,12);
intyear=Integer.parseInt(idcard.substring(6,8));
intmonth=Integer.parseInt(idcard.substring(8,10));
intday=Integer.parseInt(idcard.substring(10,12));
//判断是否为合法的省份
booleanflag=false;
for(Stringid:cityCode){
if(id.equals(provinceid)){
flag=true;
break;
}
}
if(!flag){
returnfalse;
}
//该身份证生出日期在当前日期之后时为假
Datebirthdate=null;
try{
birthdate=newSimpleDateFormat("yyMMdd").parse(birthday);
}catch(ParseExceptione){
e.printStackTrace();
}
if(birthdate==null||newDate().before(birthdate)){
returnfalse;
}
//判断是否为合法的年份
GregorianCalendarcurDay=newGregorianCalendar();
intcurYear=curDay.get(Calendar.YEAR);
intyear2bit=Integer.parseInt(String.valueOf(curYear)
.substring(2));
//判断该年份的两位表示法,小于50的和大于当前年份的,为假
if((year<50&&year>year2bit)){
returnfalse;
}
//判断是否为合法的月份
if(month<1||month>12){
returnfalse;
}
//判断是否为合法的日期
booleanmflag=false;
curDay.setTime(birthdate);//将该身份证的出生日期赋于对象curDay
switch(month){
case1:
case3:
case5:
case7:
case8:
case10:
case12:
mflag=(day>=1&&day<=31);
break;
case2://公历的2月非闰年有28天,闰年的2月是29天。
if(curDay.isLeapYear(curDay.get(Calendar.YEAR))){
mflag=(day>=1&&day<=29);
}else{
mflag=(day>=1&&day<=28);
}
break;
case4:
case6:
case9:
case11:
mflag=(day>=1&&day<=30);
break;
}
if(!mflag){
returnfalse;
}
}else{
returnfalse;
}
returntrue;
}
/**
*将15位的身份证转成18位身份证
*
*@paramidcard
*@return
*/
publicStringconvertIdcarBy15bit(Stringidcard){
Stringidcard17=null;
//非15位身份证
if(idcard.length()!=15){
returnnull;
}
if(isDigital(idcard)){
//获取出生年月日
Stringbirthday=idcard.substring(6,12);
Datebirthdate=null;
try{
birthdate=newSimpleDateFormat("yyMMdd").parse(birthday);
}catch(ParseExceptione){
e.printStackTrace();
}
Calendarcday=Calendar.getInstance();
cday.setTime(birthdate);
Stringyear=String.valueOf(cday.get(Calendar.YEAR));
idcard17=idcard.substring(0,6)+year+idcard.substring(8);
charc[]=idcard17.toCharArray();
StringcheckCode="";
if(null!=c){
intbit[]=newint[idcard17.length()];
//将字符数组转为整型数组
bit=converCharToInt(c);
intsum17=0;
sum17=getPowerSum(bit);
//获取和值与11取模得到余数进行校验码
checkCode=getCheckCodeBySum(sum17);
//获取不到校验位
if(null==checkCode){
returnnull;
}
//将前17位与第18位校验码拼接
idcard17+=checkCode;
}
}else{//身份证包含数字
returnnull;
}
returnidcard17;
}
/**
*15位和18位身份证号码的基本数字和位数验校
*
*@paramidcard
*@return
*/
publicbooleanisIdcard(Stringidcard){
returnidcard==null||"".equals(idcard)?false:Pattern.matches(
"(^\\d{15}$)|(\\d{17}(?:\\d|x|X)$)",idcard);
}
/**
*15位身份证号码的基本数字和位数验校
*
*@paramidcard
*@return
*/
publicbooleanis15Idcard(Stringidcard){
returnidcard==null||"".equals(idcard)?false:Pattern.matches(
"^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$",
idcard);
}
/**
*18位身份证号码的基本数字和位数验校
*
*@paramidcard
*@return
*/
publicbooleanis18Idcard(Stringidcard){
returnPattern
.matches(
"^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([\\d|x|X]{1})$",
idcard);
}
/**
*数字验证
*
*@paramstr
*@return
*/
publicbooleanisDigital(Stringstr){
returnstr==null||"".equals(str)?false:str.matches("^[0-9]*$");
}
/**
*将身份证的每位和对应位的加权因子相乘之后,再得到和值
*
*@parambit
*@return
*/
publicintgetPowerSum(int[]bit){
intsum=0;
if(power.length!=bit.length){
returnsum;
}
for(inti=0;i<bit.length;i++){
for(intj=0;j<power.length;j++){
if(i==j){
sum=sum+bit[i]*power[j];
}
}
}
returnsum;
}
/**
*将和值与11取模得到余数进行校验码判断
*
*@paramcheckCode
*@paramsum17
*@return校验位
*/
publicStringgetCheckCodeBySum(intsum17){
StringcheckCode=null;
switch(sum17%11){
case10:
checkCode="2";
break;
case9:
checkCode="3";
break;
case8:
checkCode="4";
break;
case7:
checkCode="5";
break;
case6:
checkCode="6";
break;
case5:
checkCode="7";
break;
case4:
checkCode="8";
break;
case3:
checkCode="9";
break;
case2:
checkCode="x";
break;
case1:
checkCode="0";
break;
case0:
checkCode="1";
break;
}
returncheckCode;
}
/**
*将字符数组转为整型数组
*
*@paramc
*@return
*@throwsNumberFormatException
*/
publicint[]converCharToInt(char[]c)throwsNumberFormatException{
int[]a=newint[c.length];
intk=0;
for(chartemp:c){
a[k++]=Integer.parseInt(String.valueOf(temp));
}
returna;
}
publicstaticvoidmain(String[]args)throwsException{
Stringidcard15="142431199001145";//15位
Stringidcard18="121212121212121212";//18位
IdcardValidatoriv=newIdcardValidator();
System.out.println(iv.isValidatedAllIdcard(idcard15));
System.out.println(iv.isValidatedAllIdcard(idcard18));
}
}
根据身份证号提取身份证相关信息
importjava.text.SimpleDateFormat;
importjava.util.Calendar;
importjava.util.Date;
importjava.util.GregorianCalendar;
importjava.util.HashMap;
importjava.util.Map;
importjava.util.Set;
/**
*<p>
*类说明:提取身份证相关信息
*</p>
*/
publicclassIdcardInfoExtractor{
//省份
privateStringprovince;
//城市
privateStringcity;
//区县
privateStringregion;
//年份
privateintyear;
//月份
privateintmonth;
//日期
privateintday;
//性别
privateStringgender;
//出生日期
privateDatebirthday;
privateMap<String,String>cityCodeMap=newHashMap<String,String>(){
{
this.put("11","北京");
this.put("12","天津");
this.put("13","河北");
this.put("14","山西");
this.put("15","内蒙古");
this.put("21","辽宁");
this.put("22","吉林");
this.put("23","黑龙江");
this.put("31","上海");
this.put("32","江苏");
this.put("33","浙江");
this.put("34","安徽");
this.put("35","福建");
this.put("36","江西");
this.put("37","山东");
this.put("41","河南");
this.put("42","湖北");
this.put("43","湖南");
this.put("44","广东");
this.put("45","广西");
this.put("46","海南");
this.put("50","重庆");
this.put("51","四川");
this.put("52","贵州");
this.put("53","云南");
this.put("54","西藏");
this.put("61","陕西");
this.put("62","甘肃");
this.put("63","青海");
this.put("64","宁夏");
this.put("65","新疆");
this.put("71","台湾");
this.put("81","香港");
this.put("82","澳门");
this.put("91","国外");
}
};
privateIdcardValidatorvalidator=null;
/**
*通过构造方法初始化各个成员属性
*/
publicIdcardInfoExtractor(Stringidcard){
try{
validator=newIdcardValidator();
if(validator.isValidatedAllIdcard(idcard)){
if(idcard.length()==15){
idcard=validator.convertIdcarBy15bit(idcard);
}
//获取省份
StringprovinceId=idcard.substring(0,2);
Set<String>key=this.cityCodeMap.keySet();
for(Stringid:key){
if(id.equals(provinceId)){
this.province=this.cityCodeMap.get(id);
break;
}
}
//获取性别
Stringid17=idcard.substring(16,17);
if(Integer.parseInt(id17)%2!=0){
this.gender="男";
}else{
this.gender="女";
}
//获取出生日期
Stringbirthday=idcard.substring(6,14);
Datebirthdate=newSimpleDateFormat("yyyyMMdd")
.parse(birthday);
this.birthday=birthdate;
GregorianCalendarcurrentDay=newGregorianCalendar();
currentDay.setTime(birthdate);
this.year=currentDay.get(Calendar.YEAR);
this.month=currentDay.get(Calendar.MONTH)+1;
this.day=currentDay.get(Calendar.DAY_OF_MONTH);
}
}catch(Exceptione){
e.printStackTrace();
}
}
/**
*@returntheprovince
*/
publicStringgetProvince(){
returnprovince;
}
/**
*@returnthecity
*/
publicStringgetCity(){
returncity;
}
/**
*@returntheregion
*/
publicStringgetRegion(){
returnregion;
}
/**
*@returntheyear
*/
publicintgetYear(){
returnyear;
}
/**
*@returnthemonth
*/
publicintgetMonth(){
returnmonth;
}
/**
*@returntheday
*/
publicintgetDay(){
returnday;
}
/**
*@returnthegender
*/
publicStringgetGender(){
returngender;
}
/**
*@returnthebirthday
*/
publicDategetBirthday(){
returnbirthday;
}
@Override
publicStringtoString(){
return"省份:"+this.province+",性别:"+this.gender+",出生日期:"
+this.birthday;
}
publicstaticvoidmain(String[]args){
Stringidcard="121212121212121212";
IdcardInfoExtractorie=newIdcardInfoExtractor(idcard);
System.out.println(ie.toString());
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。