我们都知道,现今身份证号采用18位,格式为:610101-19981101-911-X 。
- 第1、2位数字表示:所在省份的代码;
- 第3、4位数字表示:所在城市的代码;
- 第5、6位数字表示:所在区县的代码;
- 第7~14位数字表示:出生年、月、日;
- 第15、16位数字表示:所在地的派出所的代码;
- 第17位数字表示性别:奇数表示男性,偶数表示女性
- 第18位数字是校检码:检验码分别是0-10共11个数字,当检验码为“10”时,为了保证公民身份证号码18位,所以用“X”表示。虽然校验码为“X”不能更换,但若需全用数字表示,只需将18位公民身份号码转换成15位居民身份证号码,去掉第7至8位和最后1位3个数字。
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Hashtable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class CheckIdcardIsLegal {
public static String checkIdCard(String Idcard){
String mesgStr = "";
String Id = "";
//最后位为X或x时统一大写
Idcard = Idcard.toUpperCase();
//判断号码的长度为18位
if(Idcard.length()!=15 && Idcard.length()!=18){
mesgStr = "身份证号码位数应该为15位或18位!";
return mesgStr;
}
//如果为15位,则所有号码都为数字,如果为18位,前17位为数字
if(Idcard.length()==15){
//将15位身份证转换为17位数字
Id = Idcard.substring(0, 6) + "19" + Idcard.substring(6, 15);
}else if(Idcard.length()==18){
Id = Idcard.substring(0, 17);
}
if(!isNumeric(Id)){
mesgStr = "身份证15位号码都应为数字 ; 18位号码除最后一位外,都应为数字!";
return mesgStr;
}
// 判断出生年月是否有效
String strYear = Id.substring(6, 10);// 年份
String strMonth = Id.substring(10, 12);// 月份
String strDay = Id.substring(12, 14);// 日期
if (isDate(strYear + "-" + strMonth + "-" + strDay) == false) {
mesgStr = "身份证出生日期无效!";