zoukankan      html  css  js  c++  java
  • JAVA验证身份证格式及合法性

    旅游电子商务中,预订酒店或订购门票时会以身份证作为消费凭证,为了防止客户误填身份证带来不必要麻烦,需要验证码格式及合法性,代码如下:

       /**
         * 判断身份证格式
         * 
         * @param idNum
         * @return
         */
        public static boolean isIdNum(String idNum) {
    
            // 中国公民身份证格式:长度为15或18位,最后一位可以为字母
            Pattern idNumPattern = Pattern.compile("(\d{14}[0-9a-zA-Z])|(\d{17}[0-9a-zA-Z])");
    
            // 格式验证
            if (!idNumPattern.matcher(idNum).matches())
                return false;
    
            // 合法性验证
    
            int year = 0;
            int month = 0;
            int day = 0;
    
            if (idNum.length() == 15) {
    
                // 一代身份证
    
                System.out.println("一代身份证:" + idNum);
    
                // 提取身份证上的前6位以及出生年月日
                Pattern birthDatePattern = Pattern.compile("\d{6}(\d{2})(\d{2})(\d{2}).*");
    
                Matcher birthDateMather = birthDatePattern.matcher(idNum);
    
                if (birthDateMather.find()) {
    
                    year = Integer.valueOf("19" + birthDateMather.group(1));
                    month = Integer.valueOf(birthDateMather.group(2));
                    day = Integer.valueOf(birthDateMather.group(3));
    
                }
    
            } else if (idNum.length() == 18) {
    
                // 二代身份证
    
                System.out.println("二代身份证:" + idNum);
    
                // 提取身份证上的前6位以及出生年月日
                Pattern birthDatePattern = Pattern.compile("\d{6}(\d{4})(\d{2})(\d{2}).*");
    
                Matcher birthDateMather = birthDatePattern.matcher(idNum);
    
                if (birthDateMather.find()) {
    
                    year = Integer.valueOf(birthDateMather.group(1));
                    month = Integer.valueOf(birthDateMather.group(2));
                    day = Integer.valueOf(birthDateMather.group(3));
                }
    
            }
    
            // 年份判断,100年前至今
    
            Calendar cal = Calendar.getInstance();
    
            // 当前年份
            int currentYear = cal.get(Calendar.YEAR);
    
            if (year <= currentYear - 100 || year > currentYear)
                return false;
    
            // 月份判断
            if (month < 1 || month > 12)
                return false;
    
            // 日期判断
    
            // 计算月份天数
    
            int dayCount = 31;
    
            switch (month) {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                dayCount = 31;
                break;
            case 2:
                // 2月份判断是否为闰年
                if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
                    dayCount = 29;
                    break;
                } else {
                    dayCount = 28;
                    break;
                }
            case 4:
            case 6:
            case 9:
            case 11:
                dayCount = 30;
                break;
            }
    
            System.out.println(String.format("生日:%d年%d月%d日", year, month, day));
    
            System.out.println(month + "月份有:" + dayCount + "");
    
            if (day < 1 || day > dayCount)
                return false;
    
            return true;
        }
  • 相关阅读:
    NYOJ 132(最长回文子串)
    NYOJ 148(斐数求余)
    NYOJ 97
    NYOJ 206
    NYOJ 520(最大素因子的序数)
    数据库大型应用解决方案总结(转)
    SQL好的写法(转)
    WebService如何调试及测试工具
    刪除windows服務方法
    GhostDoc(注释生成工具)使用方法
  • 原文地址:https://www.cnblogs.com/tonymu/p/5431841.html
Copyright © 2011-2022 走看看