本文转自:http://www.blogjava.net/zeroline/archive/2011/01/03/342227.html 
</pre><pre name="code" class="java">
/*********************************** 身份证验证开始 ****************************************/       /**   * 身份证号码验证    * 1、号码的结构   * 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,   * 八位数字出生日期码,三位数字顺序码和一位数字校验码。   * 2、地址码(前六位数)    * 表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。    * 3、出生日期码(第七位至十四位)   * 表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。    * 4、顺序码(第十五位至十七位)   * 表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,   * 顺序码的奇数分配给男性,偶数分配给女性。    * 5、校验码(第十八位数)   * (1)十七位数字本体码加权求和公式 S = Sum(Ai * Wi), i = 0,  , 16 ,先对前17位数字的权求和   * Ai:表示第i位置上的身份证号码数字值 Wi:表示第i位置上的加权因子 Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4   * 2 (2)计算模 Y = mod(S, 11) (3)通过模得到对应的校验码 Y: 0 1 2 3 4 5 6 7 8 9 10 校验码: 1 0   * X 9 8 7 6 5 4 3 2   */    /**   * 功能:身份证的有效验证   * @param IDStr 身份证号   * @return 有效:返回"" 无效:返回String信息   * @throws ParseException   */    @SuppressWarnings("unchecked")     public static String IDCardValidate(String IDStr) throws ParseException {     String errorInfo = "";// 记录错误信息     String[] ValCodeArr = { "1", "0", "x", "9", "8", "7", "6", "5", "4",     "3", "2" };     String[] Wi = { "7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7",     "9", "10", "5", "8", "4", "2" };     String Ai = "";     // ================ 号码的长度 15位或18位 ================     if (IDStr.length() != 15 && IDStr.length() != 18) {     errorInfo = "身份证号码长度应该为15位或18位。";     return errorInfo;     }     // =======================(end)========================     // ================ 数字 除最后以为都为数字 ================     if (IDStr.length() == 18) {     Ai = IDStr.substring(0, 17);     } else if (IDStr.length() == 15) {     Ai = IDStr.substring(0, 6) + "19" + IDStr.substring(6, 15);     }     if (isNumeric(Ai) == false) {     errorInfo = "身份证15位号码都应为数字 ; 18位号码除最后一位外,都应为数字。";     return errorInfo;     }     // =======================(end)========================     // ================ 出生年月是否有效 ================     String strYear = Ai.substring(6, 10);// 年份     String strMonth = Ai.substring(10, 12);// 月份     String strDay = Ai.substring(12, 14);// 月份     if (isDate(strYear + "-" + strMonth + "-" + strDay) == false) {     errorInfo = "身份证生日无效。";     return errorInfo;     }     GregorianCalendar gc = new GregorianCalendar();     SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");     if ((gc.get(Calendar.YEAR) - Integer.parseInt(strYear)) > 150    || (gc.getTime().getTime() - s.parse(     strYear + "-" + strMonth + "-" + strDay).getTime()) < 0) {     errorInfo = "身份证生日不在有效范围。";     return errorInfo;     }     if (Integer.parseInt(strMonth) > 12 || Integer.parseInt(strMonth) == 0) {     errorInfo = "身份证月份无效";     return errorInfo;     }     if (Integer.parseInt(strDay) > 31 || Integer.parseInt(strDay) == 0) {     errorInfo = "身份证日期无效";     return errorInfo;     }     // =====================(end)=====================     // ================ 地区码时候有效 ================     Hashtable h = GetAreaCode();     if (h.get(Ai.substring(0, 2)) == null) {     errorInfo = "身份证地区编码错误。";     return errorInfo;     }     // ==============================================     // ================ 判断最后一位的值 ================     int TotalmulAiWi = 0;     for (int i = 0; i < 17; i++) {     TotalmulAiWi = TotalmulAiWi     + Integer.parseInt(String.valueOf(Ai.charAt(i)))     * Integer.parseInt(Wi[i]);     }     int modValue = TotalmulAiWi % 11;     String strVerifyCode = ValCodeArr[modValue];     Ai = Ai + strVerifyCode;     if (IDStr.length() == 18) {     if (Ai.equals(IDStr) == false) {     errorInfo = "身份证无效,不是合法的身份证号码";     return errorInfo;     }     } else {     return "";     }     // =====================(end)=====================     return "";     }     /**   * 功能:设置地区编码   * @return Hashtable 对象   */    @SuppressWarnings("unchecked")     private static Hashtable GetAreaCode() {     Hashtable hashtable = new Hashtable();     hashtable.put("11", "北京");     hashtable.put("12", "天津");     hashtable.put("13", "河北");     hashtable.put("14", "山西");     hashtable.put("15", "内蒙古");     hashtable.put("21", "辽宁");     hashtable.put("22", "吉林");     hashtable.put("23", "黑龙江");     hashtable.put("31", "上海");     hashtable.put("32", "江苏");     hashtable.put("33", "浙江");     hashtable.put("34", "安徽");     hashtable.put("35", "福建");     hashtable.put("36", "江西");     hashtable.put("37", "山东");     hashtable.put("41", "河南");     hashtable.put("42", "湖北");     hashtable.put("43", "湖南");     hashtable.put("44", "广东");     hashtable.put("45", "广西");     hashtable.put("46", "海南");     hashtable.put("50", "重庆");     hashtable.put("51", "四川");     hashtable.put("52", "贵州");     hashtable.put("53", "云南");     hashtable.put("54", "西藏");     hashtable.put("61", "陕西");     hashtable.put("62", "甘肃");     hashtable.put("63", "青海");     hashtable.put("64", "宁夏");     hashtable.put("65", "新疆");     hashtable.put("71", "台湾");     hashtable.put("81", "香港");     hashtable.put("82", "澳门");     hashtable.put("91", "国外");     return hashtable;     }     /**   * 功能:判断字符串是否为数字   * @param str   * @return   */    private static boolean isNumeric(String str) {     Pattern pattern = Pattern.compile("[0-9]*");     Matcher isNum = pattern.matcher(str);     if (isNum.matches()) {     return true;     } else {     return false;     }     }     /**   * 功能:判断字符串是否为日期格式   * @param str   * @return   */    public static boolean isDate(String strDate) {     Pattern pattern = Pattern     .compile("^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\\s(((0?[0-9])|([1-2][0-3]))\\:([0-5]?[0-9])((\\s)|(\\:([0-5]?[0-9])))))?$");     Matcher m = pattern.matcher(strDate);     if (m.matches()) {     return true;     } else {     return false;     }     }     /**   * @param args   * @throws ParseException   */    //  public static void main(String[] args) throws ParseException {     //      // String IDCardNum="210102820826411";     //      // String IDCardNum="210102198208264114";     //      String IDCardNum = "500113198606245216";     //      CommonUtil cc = new CommonUtil();     //      System.out.println(cc.IDCardValidate(IDCardNum));     //      // System.out.println(cc.isDate("1996-02-29"));     //  }     /*********************************** 身份证验证结束 ****************************************/   

JAVA 身份证号码有效性验证相关推荐

  1. Js实现中国公民身份证号码有效性验证

    2019独角兽企业重金招聘Python工程师标准>>> 参考: Java实现中国公民身份证号码有效性验证 Php实现中国公民身份证号码有效性验证 本文将使用JavaScript实现中 ...

  2. python 身份证号码有效性验证

    先声明以下代码不是全部原创,网上找了前辈的一些代码,经过自己的部分加工,有了如下的身份证有效性验证代码: #!/usr/bin/env python3 # -*- coding: utf-8 -*-i ...

  3. 身份证号码有效性验证

    结构和形式 号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. 地址码 表示编码对象 ...

  4. js实现身份证号码有效性验证

    //Js获取日期.月初时的前天.昨天.今天.明天 function getDay(day) {var today = new Date();var targetday_milliseconds = t ...

  5. Java身份证号码严格验证(第18位校验码算法实现)

    /*** 身份证号码的格式:610821-20061222-612-X 由18位数字组成:前6位为地址码,第7至14位为出生日期码,第15至17位为顺序码,* 第18位为校验码.检验码分别是0-10共 ...

  6. 【python】身份证号码有效性校验

    1. 前言 中华人民共和国国家标准GB 11643-1999<公民身份号码>中规定:公民身份号码是特征组合码,由17位数字本体码和1位校验码组成. 18位数字组合的方式是: 其中,最后一位 ...

  7. C++:18位SFZ号码有效性验证

    1.SFZ验证规则 18位SFZ号码由十七位数字本体码和一位数字校验码组成. 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. 其校验码(最后一位)计算方法 ...

  8. js身份证号有效性验证

    js身份证号有效性验证 1.简述 最近做的系统有用到实名验证的,起初对于用户身份证号只是简单地使用正则表达式进行验证, 很多无效的身份证号就成了漏网之鱼. 导致后台存表里很多无效的身份证号,随便输入用 ...

  9. 请写代码校验第二代身份证号码有效性。程序接收一个18位的身份证号码和性别,根据以下规则输出号码是有效还是无效。

    请写代码校验第二代身份证号码有效性.程序接收一个18位的身份证号码和性别,根据以下规则输出号码是有效还是无效. 第二代身份证号组成规则: a) 身份证号码(18位)= 地址码(6)+ 出生日期码(8) ...

最新文章

  1. 行业|深度解析:医疗机器人商用要过几道坎
  2. Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解
  3. numpy报错:ValueError: numpy.ufunc size changed, may indicate binary incompatibility.
  4. 11/28 前端码农日报
  5. dependencies.dependency.version' for org.apache.commons:commons-math3:jar is missing
  6. ctrl c 失效了_[安卓+PC双端]超C女仆无馬中字
  7. heartbeat与keepalived对比
  8. Android Studio 之 注释模板
  9. anaconda环境中使用sudo python报错
  10. 远程无法连接数据库的问题
  11. Jmail组件在C#中发送邮件代码:
  12. 使用getopt函数对命令行短形参进行处理
  13. ndows 内存诊断工具,windows内存诊断工具有什么作用
  14. qcloud windows rtx cpu 100%定位
  15. DataNode引用计数磁盘选择策略
  16. win32 透明窗口无边框模版
  17. 一分钟详解线结构光扫描系统
  18. 极限等价无穷小量替换笔记
  19. Emscripten中的虚拟文件系统
  20. 从1到无穷大--深度学习篇

热门文章

  1. GDUT 2.25 D
  2. Python3-豆瓣电影影片差评和影片封面照片的爬取
  3. 华为k662c的虚拟服务器,华为k662c光猫怎么样? 华为K662c拆机技巧
  4. ffmpeg与ffdshow的关系
  5. 带你认识什么是一级指针、二级指针、三级指针
  6. 坦白说自动获取有效好友
  7. 【知识兔】会计财务最常用的10个公式函数,必须收藏
  8. 历史上消失的十天--儒略日(Julian Days)的来历
  9. java判断是否是闰年
  10. RT-Thread应用实战-TI温湿度HDC1000软件包设计与制作