Java验证身份证号码及提取生日信息
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验证身份证号码及提取生日信息相关推荐
- java验证身份证号码是否有效源代码
转载自 java验证身份证号码是否有效源代码 1.描述 用java语言判断身份证号码是否有效,地区码.出身年月.校验码等验证算法 2.源代码 package test; import java.t ...
- 学以致用——Java验证身份证号码是否正确(带校验算法)
需求: 验证身份证号码是否正确(带校验算法) 源码: package javaCoreTech1; import java.io.BufferedReader; import java.io.IOEx ...
- Java从身份证号码,提取用户的出生年月日,输出用户的生日信息。
import java.util.Calendar; import java.util.Scanner;/*** 根据用户输入的身份证号码,从字符串中提取用户的出生年月日,输出用户的生日信息.要求:身 ...
- java从身份证号码中提取出生年月日
前言 给一个String 类型的 身份证号码,需要从这串数字中获取出生日期.性别.年龄 一.问题描述: 给一个String 类型的 身份证号码,需要从这串数字中获取出生日期.性别.年龄.身份证号码分为 ...
- python验证身份证号码大全_身份证号码处理技巧大全
身份证号码处理技巧大全,汇总了常用的身份证号码处理六大技巧: 不需要复杂的公式,点点鼠标即可完成,简单快捷,下面将详细介绍六大功能的具体用法.(文章最后有工具和演示文件的下载地址,可以下载下来同步操作 ...
- JAVA 输入身份证号码进行验证正误,15位转18位,并解析出生日、当前年龄、地区代码、性别
我们的身份证号码包含很多的信息,下面的代码提供了身份证的解析功能,具体看注释吧,已经写全了 import java.text.SimpleDateFormat; import java.util.Da ...
- java 身份证地址提取籍贯_从身份证号码中提取信息,这些方法请收好
小伙伴们好啊,今天老祝为大家准备了一组和身份证有关的函数公式,看看如何从身份证号码中提取出需要的信息. 如下图为所示,是一份模拟的员工信息表,A列是姓名,B列是身份证号码,C列是职级. ★ 首先咱们来 ...
- java生日验证_Java验证身份证号码是否有效
用java代码验证身份证号码是否有效 身份证号码验证 详细代码如下: MatcherUtils.java public class MatcherUtils { /*** * 验证是不是有效的身份证号 ...
- java代码验证身份证号码经典版
package com.haier.hmms.util; import java.text.SimpleDateFormat; import java.util.Date; /** * 验证身份证号 ...
最新文章
- Android GIF 编解码
- tensorflow运行环境linux,在ubuntu或者min运行环境下安装gpu版本的tensorflow
- 说一下StoreBoard和纯代码编程各有什么好处吧
- java aop execution_Spring AOP -- execution表达式
- 冲刺阶段(二) 第六天
- 通过文件锁 Lockfile/flock 让脚本单实例运行
- Android Framebuffer设置分辨率
- oracle 设置会话的编码,在Oracle中使用登录触发器初始化用户会话
- 使用GIT来管理代码的心得
- 关于命令ride.py打不开RF,而是打开pycharm编辑器问题解决思路
- vue实现钉钉扫码登录
- 如何搭建测试质量体系
- FPGA下载(kintex-7)
- LiveQing私有云流媒体-云端录像时间轴视频及列表视图
- 移动端开发兼容性处理整理
- 俞伯牙摔琴谢知音的故事
- 深度学习主机环境配置: Ubuntu16.04+Nvidia GTX 1080/980ti+CUDA8.0
- 如何评判刀片服务器性能,刀片服务器优点与刀片服务器缺点
- 绝地求生登录计算机需要授权,绝地求生计算机授权收不到怎么办 | 手游网游页游攻略大全...
- NB-IoT网络架构
热门文章
- 铭瑄H610itx升级E1.4G版本BIOS后HDMI不能输出音频(无HD audio选项)解决方法
- 【机器学习】层次聚类算法 CURE算法
- 火车余票查询(python)
- 前端常用设计模式(1)--装饰器(decorator)
- 大数据开发-职位分类
- 【工具】【docker】前端构建docker镜像文件入门
- IDEA 连接数据库报错
- 0403分部积分法-不定积分
- Facebook keyhash 获取方法总结(含 通过google play后台下载的 .der证书获取 keyhash)
- 【附源码】计算机毕业设计SSM实验室安全准入考试系统