15位身份证号的校验

 /** 
     * 验证15位身份证的合法性,该方法验证不准确,最好是将15转为18位后再判断,该类中已提供。 
     *  
     * @param idcard 
     * @return 
     */  
    public boolean isValidate15Idcard(String idcard) {  
        // 非15位为假  
        if (idcard.length() != 15) {  
            return false;  
        }  
  
        // 是否全都为数字  
        if (isDigital(idcard)) {  
            String provinceid = idcard.substring(0, 2);  
            String birthday = idcard.substring(6, 12);  
            int year = Integer.parseInt(idcard.substring(6, 8));  
            int month = Integer.parseInt(idcard.substring(8, 10));  
            int day = Integer.parseInt(idcard.substring(10, 12));  
  
            // 判断是否为合法的省份  
            boolean flag = false;  
            for (String id : cityCode) {  
                if (id.equals(provinceid)) {  
                    flag = true;  
                    break;  
                }  
            }  
            if (!flag) {  
                return false;  
            }  
            // 该身份证生出日期在当前日期之后时为假  
            Date birthdate = null;  
            try {  
                birthdate =  TimeUtils.parseDate(birthday, "yyMMdd");
            } catch (ParseException e) {  
            	logger.error("",e);
            }  
            if (birthdate == null || new Date().before(birthdate)) {  
                return false;  
            }  
  
            // 判断是否为合法的年份  
            GregorianCalendar curDay = new GregorianCalendar();  
            int curYear = curDay.get(Calendar.YEAR);  
            int year2bit = Integer.parseInt(String.valueOf(curYear)  
                    .substring(2));  
  
            // 判断该年份的两位表示法,小于50的和大于当前年份的,为假  
            if ((year < 50 && year > year2bit)) {  
                return false;  
            }  
  
            // 判断是否为合法的月份  
            if (month < 1 || month > 12) {  
                return false;  
            }  
  
            // 判断是否为合法的日期  
            boolean mflag = false;  
            curDay.setTime(birthdate); // 将该身份证的出生日期赋于对象curDay  
            switch (month) {  
            case 1:  
            case 3:  
            case 5:  
            case 7:  
            case 8:  
            case 10:  
            case 12:  
                mflag = (day >= 1 && day <= 31);  
                break;  
            case 2: // 公历的2月非闰年有28天,闰年的2月是29天。  
                if (curDay.isLeapYear(curDay.get(Calendar.YEAR))) {  
                    mflag = (day >= 1 && day <= 29);  
                } else {  
                    mflag = (day >= 1 && day <= 28);  
                }  
                break;  
            case 4:  
            case 6:  
            case 9:  
            case 11:  
                mflag = (day >= 1 && day <= 30);  
                break;  
            }  
            if (!mflag) {  
                return false;  
            }  
        } else {  
            return false;  
        }  
        return true;  
    }  
  

猜你喜欢

转载自blog.csdn.net/Scarlett1994/article/details/82854106