package org.springblade.common.utils; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * 身份证号码校验工具类 * @author zhongrj * @since 2021-11-29 */ public class IdCardNoUtil { /** * 身份证号码校验 * @param idCardNo * @return */ public static boolean checkIdCardNo(String idCardNo){ //先校验长度 if (idCardNo.length()!=18){ return false; } //将末尾可能存在的x转成X idCardNo=idCardNo.toUpperCase(); String regex=""; //前6位地址码。后面仍需打表校验 regex+="^[1-6]\\d{5}"; //年份。后面仍需校验 regex+="(18|19|20)\\d{2}"; //月份。后面仍需校验 regex+="((0[1-9])|(1[0-2]))"; //日期。后面仍需校验 regex+="(([0-2][1-9])|10|20|30|31)"; //3位顺序码 regex+="\\d{3}"; //检验码。后面仍需验证 regex+="[0-9X]"; if(!idCardNo.matches(regex)){ return false; } //第1,2位(省)打表进一步校验 int[] d={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,53, 61,62,63,64,65, 83,81,82}; boolean flag=false; int prov=Integer.parseInt(idCardNo.substring(0, 2)); for(int i=0;icurDate.getTime()) { return false; } //生日校验:每个月的天数不一样(有的月份没有31),还要注意闰年的二月 int year=Integer.parseInt(idCardNo.substring(6, 10)); int leap=((year%4==0 && year%100!=0) || year%400==0)?1:0; final int[] month={0,31,28+leap,31,30,31,30,31,31,30,31,30,31}; int mon=Integer.parseInt(idCardNo.substring(10, 12)); int day=Integer.parseInt(idCardNo.substring(12, 14)); if(day>month[mon]){ //System.out.println(day+" "+month[mon]+"\n"); //System.out.println("---"); return false; } //检验码 if(idCardNo.charAt(17)!=getLastChar(idCardNo)) { return false; } return true; } /** * 根据身份证号判断用户性别 * @param cardNo * @return */ public static String getSex(String cardNo) { String sexStr = "0"; if (cardNo.length() == 15) { sexStr = cardNo.substring(14, 15); } else if (cardNo.length() == 18) { sexStr = cardNo.substring(16,17); } int sexNo = Integer.parseInt(sexStr); return sexNo % 2 == 0 ? "女" : "男"; } public static void main(String[] args) { System.out.println(getSex("530121198903119551")); } /** * 根据身份证号码的前17位计算校验码 * @param idNum * @return */ public static char getLastChar(String idNum){ final int[] w={0,7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; //这就是为什么一开始将末尾可能存在的x转成X的原因 final char[] ch={'1','0','X','9','8','7','6','5','4','3','2'}; int res=0; for(int i=0;i<17;i++) { int t=idNum.charAt(i)-'0'; res+=(t*w[i+1]); } return ch[res%11]; } }