/**
     * 检验身份证号码
     * @param idCard
     * @return
     */
    public static boolean checkIDCard(String idCard){

        Pattern chinaPattern = Pattern
                .compile("(^\\d{15}$)|(^\\d{17}([0-9]|X)$)");
        Matcher matcher = chinaPattern.matcher(idCard);

        if (!matcher.matches()) {
            return false;
        }

        HashMap<Integer,String> cityMap = new HashMap<>();
        cityMap.put(11,"北京");
        cityMap.put(12,"天津");
        cityMap.put(13,"河北");
        cityMap.put(14,"山西");
        cityMap.put(15,"内蒙古");
        cityMap.put(21,"辽宁");
        cityMap.put(22,"吉林");
        cityMap.put(23,"黑龙江");
        cityMap.put(31,"上海");
        cityMap.put(32,"江苏");
        cityMap.put(33,"浙江");
        cityMap.put(34,"安徽");
        cityMap.put(35,"福建");
        cityMap.put(36,"江西");
        cityMap.put(37,"山东");
        cityMap.put(41,"河南");
        cityMap.put(42,"湖北");
        cityMap.put(43,"湖南");
        cityMap.put(44,"广东");
        cityMap.put(45,"广西");
        cityMap.put(46,"海南");
        cityMap.put(50,"重庆");
        cityMap.put(51,"四川");
        cityMap.put(52,"贵州");
        cityMap.put(53,"云南");
        cityMap.put(54,"西藏");
        cityMap.put(61,"陕西");
        cityMap.put(62,"甘肃");
        cityMap.put(63,"青海");
        cityMap.put(64,"宁夏");
        cityMap.put(65,"新疆");
        cityMap.put(71,"台湾");
        cityMap.put(81,"香港");
        cityMap.put(82,"澳门");
        cityMap.put(91,"国外");


        Set<Integer> keys = cityMap.keySet();

        if (!keys.contains(Integer.parseInt(idCard.substring(0, 2)))) {
            return false;
        }


        int length = idCard.length();
        if (length == 15) {
            Pattern pattern = Pattern
                    .compile("^(\\d{6})(\\d{2})(\\d{2})(\\d{2})(\\d{3})$");

            Matcher matcher1 = pattern.matcher(idCard);

            if (matcher1.matches()) {

                String str = "19"+matcher1.group(2)+"/"+matcher1.group(3)+"/"+matcher1.group(4);
                //指定转换格式
                DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd");
                //进行转换
                LocalDate date = LocalDate.parse(str, fmt);

                String year = "19"+matcher1.group(2);

                if (!(date.getYear() == Integer.parseInt(year)
                        && date.getMonthValue() == Integer.parseInt(matcher1.group(3))
                        && date.getDayOfMonth() == Integer.parseInt(matcher1.group(4)))) {

                    return false;
                } else {

                    return true;
                }

            }
        }

        if (length == 18) {
            Pattern pattern = Pattern
                    .compile("^(\\d{6})(\\d{4})(\\d{2})(\\d{2})(\\d{3})([0-9]|X)$");

            Matcher matcher1 = pattern.matcher(idCard);

            if (matcher1.matches()) {
                String str = matcher1.group(2)+"/"+matcher1.group(3)+"/"+matcher1.group(4);
                //指定转换格式
                DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd");
                //进行转换
                LocalDate date = LocalDate.parse(str, fmt);

                if (!(date.getYear() == Integer.parseInt(matcher1.group(2))
                        && date.getMonthValue() == Integer.parseInt(matcher1.group(3))
                        && date.getDayOfMonth() == Integer.parseInt(matcher1.group(4)))) {

                    return false;
                } else {
                    //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10
                    Integer[] arrInt = new Integer[]{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
                    String[] arrCh = new String[]{"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};

                    int nTemp = 0;
                    for (int i = 0; i < 17; i++) {
                        nTemp += Integer.parseInt(idCard.substring(i,i+1)) * arrInt[i];
                    }

                    String valNum = arrCh[nTemp % 11];
                    return valNum.equals(idCard.substring(17, 18));
                }

            }
        }

        return true;
    }