Java学习第一站,导师给布置的作业题,验证身份证号码的合法性并提取生日信息。第一次写Java代码,第一次用博客记录学习进程,略紧张,对Java变量的命名还停留在C++的命名法阶段,吼吼~~现在开始正题。
问题说明:目前,我国大部分地区都使用的是第二代身份证,第二代身份证号码的位数为18位。但公安部没有下发统一的关于停用第一代身份证的文件,第一代身份证中有15位和18位身份证号的混用。
15位身份证号码:排列顺序从左至右依次为:6位数字地址码,6位数字出生日期码,3位数字顺序码,其中出生日期码不包含世纪数。
18位身份证号码:公民身份号码是特征组合码,由17位数字码和1位校验码组成。排列顺序从左至右依次为:6位数字地址码,8位数字出生日期码,3位数字顺序码和1位数字校验码。
【地址码】:表示编码对象常住户口所在县(市、旗、区)的行政区划代码。
前两位代码表示省、自治区、直辖市、特别行政区:
——11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",
——21:"辽宁",22:"吉林",23:"黑龙江",
——31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",
——41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",
——50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",
——61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",
——71:"台湾",81:"香港",82:"澳门",91:"国外"
中间两位代码表示市、地区、自治州、盟、直辖市所辖市辖区、县汇总码、省(自治区)直辖县级行政区划汇总码,其中:
——01~20、51~70表示市,01、02还用于表示直辖市所辖市辖区、县汇总码;
——21~50表示地区、自治州、盟;
——90表示省(自治区)直辖县级行政区划汇总码。
最后两位表示县、自治县、县级市、旗、自治旗、市辖区、林区、特区,其中:
——01~20表示市辖区、地区(自治州、盟)辖县级市、市辖特区以及省(自治区)直辖县级行政区划中的县级市,01通常表示辖区汇总码;
——21~80表示县、自治县、旗、自治旗、林区、地区辖特区;
——81~99表示省(自治区)辖县级市。
【出生日期码】:表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。
【随机码】:生日编码之后的两位为随机生成数。
【顺序码】:顺序码的奇数分给男性,偶数分给女性。
【校验码】:是根据前面十七位数字码计算出来的,计算方法如下:

Index =  ∑(a[i]*W[i]) mod 11 ( i = 0, 1, ..., 16 )

a[i]: 表示身份证号码第 i 位上的数字值

W[i]: 表示第 i 位上的加权因子 ,W={7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2}。

身份证号码的校验码 = R[Index],R={1 0 X 9 8 7 6 5 4 3 2}。

由此看出 X 就是 10,罗马数字中的 10 就是X,所以在新标准的身份证号码中可能含有非数字的字母X。

思路分析: 针对给出的身份证组成信息验证身份证号是否合法。1. 验证身份证号是否是15位或者18位;2. 验证身份证号是否都是由数字组成;3. 验证身份证号的前两位是否属于行政区化代码中;4.验证身份证号的生日信息是否正确;5.对于18位的身份证号,验证校验码是否正确。

参考博客:http://www.cnblogs.com/tenking/archive/2009/12/07 /2075290.html;

http://love3400wind.blog.163.com/blog/static /7963080120095862446850/

  1 package idcard;
  2
  3 import java.util.Calendar;
  4 import java.util.Date;
  5
  6 public class isLegalToIDNumber {
  7
  8     public static void main(String[] args) {
  9         // TODO Auto-generated method stub
 10         String[] strIDNumberArr = {"53010119810602001x","330521197411044030","53010119810602007x"};
 11         for (int i = 0; i < strIDNumberArr.length; ++i){
 12             if (isLegal(strIDNumberArr[i])){
 13                 System.out.println(strIDNumberArr[i] + "为正确的身份证号。");
 14                 displayBirthDate(strIDNumberArr[i]);
 15             }
 16             else{
 17                 System.out.println(strIDNumberArr[i] + "为错误身份证号。");
 18             }
 19         }
 20     }
 21
 22     public static boolean isLegal(String strID){
 23         boolean flag = true;
 24         //判断输入的字符串是否为空
 25         if ((strID == null) || (strID.length() <= 0) || strID.equals("")){
 26             flag = false;
 27         }
 28         //判断输入的字符串长度是否为15或者18
 29         if (strID.length() != 15 && strID.length() != 18){
 30             flag = false;
 31         }
 32         //判断输入的字符串是否都为数字
 33         if (!isDigit(strID)){
 34             flag = false;
 35         }
 36         //判断身份证号的前两位是否正确
 37         if (!isCorrectFirstTwo(strID.substring(0,2))){
 38             flag = false;
 39         }
 40         //验证生日是否正确
 41         String strBirthDay = "";
 42         if (strID.length() == 15){
 43             strBirthDay = "19" + strID.substring(6,12);
 44         }
 45         else{
 46             strBirthDay = strID.substring(6,14);
 47         }
 48         if (!isCorrectBirthDay(strBirthDay)){
 49             flag = false;
 50         }
 51         //验证18位身份证号的校验码是否正确
 52         if (strID.length() == 18){
 53             if (!isCheckCode(strID)){
 54                 flag = false;
 55             }
 56         }
 57         return flag;
 58     }
 59
 60     public static void displayBirthDate(String strID){
 61         String strYear = "";
 62         String strMonth = "";
 63         String strDay = "";
 64
 65         if (strID.length() == 15){
 66             strYear = "19" + strID.substring(6,8);
 67             strMonth = strID.substring(8,10);
 68             strDay = strID.substring(10,12);
 69         }
 70
 71         if (strID.length() == 18){
 72             strYear = strID.substring(6,10);
 73             strMonth = strID.substring(10,12);
 74             strDay = strID.substring(12,14);
 75         }
 76
 77         System.out.println("生日日期为:" + strYear + "年" + strMonth + "月" + strDay + "日");
 78     }
 79
 80     public static boolean isCheckCode(String strID){
 81          // 每位加权因子
 82         final int arrWeight[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
 83          // 第18位校检码
 84         final String strArrCheckCode[] = { "1", "0", "X", "9", "8", "7", "6", "5",
 85                 "4", "3", "2" };
 86         //将身份证号前17位存入数组,进行下一步计算
 87         int[] arrID = new int[17];
 88         for (int i = 0; i < 17; ++i){
 89             arrID[i] = Integer.parseInt(strID.substring(i, i + 1));
 90         }
 91         int nSum = 0;
 92         for (int i = 0; i < 17; ++i){
 93             nSum += arrID[i] * arrWeight[i];
 94         }
 95         int nIdx = nSum % 11;
 96         String strLast = strID.substring(17);
 97         if (strArrCheckCode[nIdx].equals(strLast)){
 98             return true;
 99         }
100         else{
101             return false;
102         }
103     }
104
105     public static boolean isCorrectBirthDay(String strDate){
106         int nYear = Integer.parseInt(strDate.substring(0, 4));
107         int nMonth = Integer.parseInt(strDate.substring(4, 6));
108         int nDay = Integer.parseInt(strDate.substring(6, 8));
109         //获取系统当前的日期,判断是否在当前日期之前
110         Date curDate = new Date();
111         Calendar cal = Calendar.getInstance();
112         cal.setTime(curDate);
113         if (nYear > cal.get(Calendar.YEAR)){
114             return false;
115         }
116         //判断是否为合法月份
117         if (nMonth < 1 || nMonth > 12){
118             return false;
119         }
120         //判断是否为合法日期
121         boolean bFlag = false;
122         switch(nMonth){
123         case 1:
124         case 3:
125         case 5:
126         case 7:
127         case 8:
128         case 10:
129         case 12:
130             if (nDay >= 1 && nDay <= 31){
131                 bFlag = true;
132             }
133             break;
134         case 2:
135             if ((((nYear % 4 == 0) && (nYear % 100 != 0))|| (nYear % 400 == 0))){
136                 if (nDay >=1 && nDay <= 29){
137                     bFlag = true;
138                 }
139             }
140             else{
141                 if (nDay >=1 && nDay <= 28){
142                     bFlag = true;
143                 }
144             }
145             break;
146         case 4:
147         case 6:
148         case 9:
149         case 11:
150             if (nDay >= 1 && nDay <= 30){
151                 bFlag = true;
152             }
153             break;
154         }
155         if (!bFlag){
156             return false;
157         }
158         return true;
159     }
160
161     public static boolean isCorrectFirstTwo(String strID12){
162         final String strArrCityCode[] = { "11", "12", "13", "14", "15", "21", "22",
163                 "23", "31", "32", "33", "34", "35", "36", "37", "41", "42", "43",
164                 "44", "45", "46", "50", "51", "52", "53", "54", "61", "62", "63",
165                 "64", "65", "71", "81", "82", "91" };
166         boolean bFlag = false;
167         for (String strIdx : strArrCityCode){
168             if (strIdx.equalsIgnoreCase(strID12))
169             {
170                 bFlag = true;
171                 break;
172             }
173         }
174         if (bFlag){
175             return true;
176         }
177         return false;
178     }
179
180     public static boolean isDigit(String strID){
181         int nDigitCnt = 0;
182         int nLength = (strID.length() == 15)? strID.length() : (strID.length() - 1);
183         for (int i = 0; i < nLength; ++i){
184             char cTmp = strID.charAt(i);
185             if (cTmp >= '0' && cTmp <= '9'){
186                 ++nDigitCnt;
187             }
188         }
189         if (nDigitCnt != nLength){
190             return false;
191         }
192         else{
193             return true;
194         }
195     }
196
197
198 }

转载于:https://www.cnblogs.com/Bunnyxiaochouchou/p/3766642.html

Java验证身份证号码及提取生日信息相关推荐

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

    转载自   java验证身份证号码是否有效源代码 1.描述 用java语言判断身份证号码是否有效,地区码.出身年月.校验码等验证算法 2.源代码 package test; import java.t ...

  2. 学以致用——Java验证身份证号码是否正确(带校验算法)

    需求: 验证身份证号码是否正确(带校验算法) 源码: package javaCoreTech1; import java.io.BufferedReader; import java.io.IOEx ...

  3. Java从身份证号码,提取用户的出生年月日,输出用户的生日信息。

    import java.util.Calendar; import java.util.Scanner;/*** 根据用户输入的身份证号码,从字符串中提取用户的出生年月日,输出用户的生日信息.要求:身 ...

  4. java从身份证号码中提取出生年月日

    前言 给一个String 类型的 身份证号码,需要从这串数字中获取出生日期.性别.年龄 一.问题描述: 给一个String 类型的 身份证号码,需要从这串数字中获取出生日期.性别.年龄.身份证号码分为 ...

  5. python验证身份证号码大全_身份证号码处理技巧大全

    身份证号码处理技巧大全,汇总了常用的身份证号码处理六大技巧: 不需要复杂的公式,点点鼠标即可完成,简单快捷,下面将详细介绍六大功能的具体用法.(文章最后有工具和演示文件的下载地址,可以下载下来同步操作 ...

  6. JAVA 输入身份证号码进行验证正误,15位转18位,并解析出生日、当前年龄、地区代码、性别

    我们的身份证号码包含很多的信息,下面的代码提供了身份证的解析功能,具体看注释吧,已经写全了 import java.text.SimpleDateFormat; import java.util.Da ...

  7. java 身份证地址提取籍贯_从身份证号码中提取信息,这些方法请收好

    小伙伴们好啊,今天老祝为大家准备了一组和身份证有关的函数公式,看看如何从身份证号码中提取出需要的信息. 如下图为所示,是一份模拟的员工信息表,A列是姓名,B列是身份证号码,C列是职级. ★ 首先咱们来 ...

  8. java生日验证_Java验证身份证号码是否有效

    用java代码验证身份证号码是否有效 身份证号码验证 详细代码如下: MatcherUtils.java public class MatcherUtils { /*** * 验证是不是有效的身份证号 ...

  9. java代码验证身份证号码经典版

    package com.haier.hmms.util; import java.text.SimpleDateFormat; import java.util.Date; /**  * 验证身份证号 ...

最新文章

  1. Android GIF 编解码
  2. tensorflow运行环境linux,在ubuntu或者min运行环境下安装gpu版本的tensorflow
  3. 说一下StoreBoard和纯代码编程各有什么好处吧
  4. java aop execution_Spring AOP -- execution表达式
  5. 冲刺阶段(二) 第六天
  6. 通过文件锁 Lockfile/flock 让脚本单实例运行
  7. Android Framebuffer设置分辨率
  8. oracle 设置会话的编码,在Oracle中使用登录触发器初始化用户会话
  9. 使用GIT来管理代码的心得
  10. 关于命令ride.py打不开RF,而是打开pycharm编辑器问题解决思路
  11. vue实现钉钉扫码登录
  12. 如何搭建测试质量体系
  13. FPGA下载(kintex-7)
  14. LiveQing私有云流媒体-云端录像时间轴视频及列表视图
  15. 移动端开发兼容性处理整理
  16. 俞伯牙摔琴谢知音的故事
  17. 深度学习主机环境配置: Ubuntu16.04+Nvidia GTX 1080/980ti+CUDA8.0
  18. 如何评判刀片服务器性能,刀片服务器优点与刀片服务器缺点
  19. 绝地求生登录计算机需要授权,绝地求生计算机授权收不到怎么办 | 手游网游页游攻略大全...
  20. NB-IoT网络架构

热门文章

  1. 铭瑄H610itx升级E1.4G版本BIOS后HDMI不能输出音频(无HD audio选项)解决方法
  2. 【机器学习】层次聚类算法 CURE算法
  3. 火车余票查询(python)
  4. 前端常用设计模式(1)--装饰器(decorator)
  5. 大数据开发-职位分类
  6. 【工具】【docker】前端构建docker镜像文件入门
  7. IDEA 连接数据库报错
  8. 0403分部积分法-不定积分
  9. Facebook keyhash 获取方法总结(含 通过google play后台下载的 .der证书获取 keyhash)
  10. 【附源码】计算机毕业设计SSM实验室安全准入考试系统