1. import java.text.SimpleDateFormat;
  2. import java.util.Calendar;
  3. import java.util.GregorianCalendar;
  4. import java.util.Hashtable;
  5. import java.util.regex.Matcher;
  6. import java.util.regex.Pattern;
  7. import java.text.ParseException;
  8.  
  9. /**
  10. * @author open
  11. * 使用方法:调用 IDCardUtil.IDCardValidate(str)验证是否为合法的身份证.返回的是一个String,"YES" 代表合法的身份证 ,其他值代表错误信息
  12. *
  13. */
  14. public class IDCardUtil {
  15. /**
  16. * 验证身份证
  17. * @param IDStr
  18. * @return "YES" 代表合法的身份证 ,其他值代表错误信息
  19. * @throws ParseException
  20. */
  21. public static String IDCardValidate(String IDStr) {
  22. String tipInfo = "YES";// 记录错误信息
  23. String Ai = "";
  24.  
  25. if(null == IDStr || IDStr.trim().isEmpty())
  26. return "身份证号码长度应该为15位或18位。";
  27.  
  28. // 判断号码的长度 15位或18位
  29. if (IDStr.length() != 15 && IDStr.length() != 18) {
  30. tipInfo = "身份证号码长度应该为15位或18位。";
  31. return tipInfo;
  32. }
  33. // 18位身份证前17位位数字,如果是15位的身份证则所有号码都为数字
  34. if (IDStr.length() == 18) {
  35. Ai = IDStr.substring(0, 17);
  36. } else if (IDStr.length() == 15) {
  37. Ai = IDStr.substring(0, 6) + "19" + IDStr.substring(6, 15);
  38. }
  39. if (isNumeric(Ai) == false) {
  40. tipInfo = "身份证15位号码都应为数字 ; 18位号码除最后一位外,都应为数字。";
  41. return tipInfo;
  42. }
  43. // 判断出生年月是否有效
  44. String strYear = Ai.substring(6, 10);// 年份
  45. String strMonth = Ai.substring(10, 12);// 月份
  46. String strDay = Ai.substring(12, 14);// 日期
  47. if (isDate(strYear + "-" + strMonth + "-" + strDay) == false) {
  48. tipInfo = "身份证出生日期无效。";
  49. return tipInfo;
  50. }
  51. GregorianCalendar gc = new GregorianCalendar();
  52. SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");
  53. try {
  54. if ((gc.get(Calendar.YEAR) - Integer.parseInt(strYear)) > 150
  55. || (gc.getTime().getTime() - s.parse(strYear + "-" + strMonth + "-" + strDay).getTime()) < 0) {
  56. tipInfo = "身份证生日不在有效范围。";
  57. return tipInfo;
  58. }
  59. } catch (NumberFormatException e) {
  60. e.printStackTrace();
  61. } catch (java.text.ParseException e) {
  62. e.printStackTrace();
  63. }
  64. if (Integer.parseInt(strMonth) > 12 || Integer.parseInt(strMonth) == 0) {
  65. tipInfo = "身份证月份无效";
  66. return tipInfo;
  67. }
  68. if (Integer.parseInt(strDay) > 31 || Integer.parseInt(strDay) == 0) {
  69. tipInfo = "身份证日期无效";
  70. return tipInfo;
  71. }
  72. // 判断地区码是否有效
  73. Hashtable areacode = GetAreaCode();
  74. // 如果身份证前两位的地区码不在Hashtable,则地区码有误
  75. if (areacode.get(Ai.substring(0, 2)) == null) {
  76. tipInfo = "身份证地区编码错误。";
  77. return tipInfo;
  78. }
  79. if (isVarifyCode(Ai, IDStr) == false) {
  80. tipInfo = "身份证校验码无效,不是合法的身份证号码";
  81. return tipInfo;
  82. }
  83. return tipInfo;
  84. }
  85.  
  86. /*
  87. * 判断第18位校验码是否正确 第18位校验码的计算方式: 1. 对前17位数字本体码加权求和 公式为:S = Sum(Ai * Wi), i =
  88. * 0, ... , 16 其中Ai表示第i个位置上的身份证号码数字值,Wi表示第i位置上的加权因子,其各位对应的值依次为: 7 9 10 5 8 4
  89. * 2 1 6 3 7 9 10 5 8 4 2 2. 用11对计算结果取模 Y = mod(S, 11) 3. 根据模的值得到对应的校验码
  90. * 对应关系为: Y值: 0 1 2 3 4 5 6 7 8 9 10 校验码: 1 0 X 9 8 7 6 5 4 3 2
  91. */
  92. private static boolean isVarifyCode(String Ai, String IDStr) {
  93. String[] VarifyCode = { "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" };
  94. String[] Wi = { "7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2" };
  95. int sum = 0;
  96. for (int i = 0; i < 17; i++) {
  97. sum = sum + Integer.parseInt(String.valueOf(Ai.charAt(i))) * Integer.parseInt(Wi[i]);
  98. }
  99. int modValue = sum % 11;
  100. String strVerifyCode = VarifyCode[modValue];
  101. Ai = Ai + strVerifyCode;
  102. if (IDStr.length() == 18) {
  103. if (Ai.equals(IDStr) == false) {
  104. return false;
  105. }
  106. }
  107. return true;
  108. }
  109.  
  110. /**
  111. * 将所有地址编码保存在一个Hashtable中
  112. *
  113. * @return Hashtable 对象
  114. */
  115. private static Hashtable GetAreaCode() {
  116. Hashtable hashtable = new Hashtable();
  117. hashtable.put("11", "北京");
  118. hashtable.put("12", "天津");
  119. hashtable.put("13", "河北");
  120. hashtable.put("14", "山西");
  121. hashtable.put("15", "内蒙古");
  122. hashtable.put("21", "辽宁");
  123. hashtable.put("22", "吉林");
  124. hashtable.put("23", "黑龙江");
  125. hashtable.put("31", "上海");
  126. hashtable.put("32", "江苏");
  127. hashtable.put("33", "浙江");
  128. hashtable.put("34", "安徽");
  129. hashtable.put("35", "福建");
  130. hashtable.put("36", "江西");
  131. hashtable.put("37", "山东");
  132. hashtable.put("41", "河南");
  133. hashtable.put("42", "湖北");
  134. hashtable.put("43", "湖南");
  135. hashtable.put("44", "广东");
  136. hashtable.put("45", "广西");
  137. hashtable.put("46", "海南");
  138. hashtable.put("50", "重庆");
  139. hashtable.put("51", "四川");
  140. hashtable.put("52", "贵州");
  141. hashtable.put("53", "云南");
  142. hashtable.put("54", "西藏");
  143. hashtable.put("61", "陕西");
  144. hashtable.put("62", "甘肃");
  145. hashtable.put("63", "青海");
  146. hashtable.put("64", "宁夏");
  147. hashtable.put("65", "新疆");
  148. hashtable.put("71", "台湾");
  149. hashtable.put("81", "香港");
  150. hashtable.put("82", "澳门");
  151. hashtable.put("91", "国外");
  152. return hashtable;
  153. }
  154.  
  155. /**
  156. * 判断字符串是否为数字,0-9重复0次或者多次
  157. *
  158. * @param strnum
  159. * @return
  160. */
  161. private static boolean isNumeric(String strnum) {
  162. Pattern pattern = Pattern.compile("[0-9]*");
  163. Matcher isNum = pattern.matcher(strnum);
  164. if (isNum.matches()) {
  165. return true;
  166. } else {
  167. return false;
  168. }
  169. }
  170.  
  171. /**
  172. * 功能:判断字符串出生日期是否符合正则表达式:包括年月日,闰年、平年和每月31天、30天和闰月的28天或者29天
  173. *
  174. * @param string
  175. * @return
  176. */
  177. public static boolean isDate(String strDate) {
  178. Pattern pattern = Pattern.compile(
  179. "^((\\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]))))))?$");
  180. Matcher m = pattern.matcher(strDate);
  181. if (m.matches()) {
  182. return true;
  183. } else {
  184. return false;
  185. }
  186. }
  187.  
  188. }

原文地址:https://blog.csdn.net/the_thinnest/article/details/78226509

Java验证身份证是否合法的更多相关文章

  1. JAVA验证身份证号码是否合法

    package com.chauvet.utils; import java.text.ParseException; import java.text.SimpleDateFormat; impor ...

  2. JAVA验证身份证号码是否正确

    package com.IdCard; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.D ...

  3. java 验证手机号是否合法

    一.通用工具类编写 /** * @project * @Description * @Author songwp * @Date 2022/9/15 17:06 * @Version 1.0.0 ** ...

  4. java验证手机号码是否合法

    公司开发新功能须要验证手机号码,遂自己写了个出来,暂仅仅支持中国大陆手机号验证.如有不妥之处,还望大家指教,感激不尽! /** * 验证是否是正确合法的手机号码 * * @param telephon ...

  5. JAVA验证身份证格式及合法性

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

  6. java验证身份证合理性

    package com.tiantian.util; import java.util.Calendar;import java.util.HashMap;import java.util.Map;i ...

  7. java验证身份证号码是否有效源代码 wn25的头像 wn25 23 2015-01-04 20:09 6 基本信息 Java × 1 浏览

    原文:http://www.open-open.com/code/view/1420373343171 1.描述 用java语言判断身份证号码是否有效,地区码.出身年月.校验码等验证算法 2.源代码 ...

  8. java验证身份证号码是否有效源代码

    原文:http://www.open-open.com/code/view/1420373343171 1.描述 用java语言判断身份证号码是否有效,地区码.出身年月.校验码等验证算法 2.源代码 ...

  9. java 验证身份证号

随机推荐

  1. nginx - 反向代理 - 配置文件 header - 日志log格式

    server { listen ; server_name paas.service.consul; client_max_body_size 512m; access_log /data/bkdat ...

  2. [转帖]etcd 在超大规模数据场景下的性能优化

    etcd 在超大规模数据场景下的性能优化   阿里系统软件技术 2019-05-27 09:13:17 本文共5419个字,预计阅读需要14分钟. http://www.itpub.net/2019/ ...

  3. 水晶报表和rdlc报表传入参数筛选

    在使用报表向客户展示结果数据时,实时的在报表中显示某些特定的数据是必需的,如:显示的部门.打印的日期等.本文只简单的演示向报表内传入一个字符值. 以下是设计好报表之后传入参数的具体操作 一.首先是水晶 ...

  4. JAVA基础--JAVA API常见对象(字符串&缓冲区)

    一. String 类型 1. String类引入 第二天学习过Java中的常量:   常量的分类:   数值型常量:整数,小数(浮点数) 字符型常量:使用单引号引用的数据 字符串常量:使用双引号引用 ...

  5. SYN攻击源码

    一.linux下源代码实现/* syn flood by wqfhenanxc. * random soruce ip and random sourec port. * use #include & ...

  6. 蚂蚁分类信息商家发布文章、商品外链及远程图片自动添加nofollow属性

    蚂蚁商户发布文章.商品是可以添加外链或者直接用外部图片,但是这对分类网站运营不利. 所以要对外链进行过滤,演示网站保洁,蚂蚁分类的源码. 下面就说下怎么处理自动给外链自动加上nofollow属性. 1 ...

  7. Redis 高可用之哨兵模式(二)

    上一篇实际操作过程中遇到两个问题 问题一:虽然运行了3个sentinel容器,实际上只有一个sentinel运行 问题出现的原因很简单,三个sentinel用的是同一个挂载配置文件,容器内部的更改直接 ...

  8. Select2的远程数据操作

    一.概述 如果下拉列表框中的内容太多,最好是使用Select2的远程数据进行筛选. 二.参考文献 https://select2.github.io/examples.html#data-ajax h ...

  9. sql server update语句

    update语句 --Update 语句用于修改表中的数据 语法:update 表名称 set 列名称 = 新值 where 列名称 = 某值 --更新某一行的若干列,set字句中用','隔开

  10. JAVA高级语法

    高级语法 第三章:面向对象和高级语法 实例化: 不实例化,就是一个空指针 注意,声明和实例化是两个过程.声明的过程是不分配内存空间的,只有实例化才会真正分配空间 对变量的分类 实例变量只有实例化之后才 ...