身份证号码18位与15位转换
公民身份证号码18位数字含义

公民身份证号码18位数字含义2010.07目前我国公民身份证号码由18位数字组成:前6位为地址码,第7至14位为出生日期码,第15至17位为顺序码,第18位为校验码。
检验码分别是“0、1、2、……10”共11个数字,当检验码为“10”时,为了保证公民身份证号码18位,所以用“X”表示。
虽然校验码为“X”不能更换,但若需全用数字表示,只需将18位公民身份号码转换成15位居民身份证号码,去掉第7至8位和最后1位3个数码。
当今的身份证号码有15位和18位之分。
1985年我国实行居民身份证制度,当时签发的身份证号码是15位的,1999年签发的身份证由于年份的扩展(由两位变为四位)和末尾加了效验码,就成了18位。
这两种身份证号码将在相当长的一段时期内共存。
两种身份证号码的含义如下:18位的身份证号码如:130429####%%%%00781~6位为地区代码,其中1、2位数为各省级政府的代码,3、4位数为地、市级政府的代码,5、6位数为县、区级政府代码。
如13(河北省)04(邯郸市)29(永年县)7~14位为出生年月日15~17位为顺序号,是县、区级政府所辖派出所的分配码,每个派出所分配码为10个连续号码,例如“000-009”或“060-069”,其中单数为男性分配码,双数为女性分配码,如遇同年同月同日有两人以上时顺延第二、第三、第四、第五个分配码。
如:007的就是个男生而且和他同年月日生的男生至少有两个他们的后四位是001* 和003*18位为效验位(识别码),通过复杂公式算出,普遍采用计算机自动生成。
是前面17位的一种检验代码,如果你改变了前面某个数字而后面的效验代码不响应改变就会被计算软件判断为非法身份正号码。
X也是效验代码的一中15位的身份证号码:(1)1~6位为地区代码(2)7~8位为出生年份(2位),9~10位为出生月份,11~12位为出生日期(3)第13~15位为顺序号,并能够判断性别,奇数为男,偶数为女。
15位身份证号转换为18位

Excel中将15位身份证号转换为18位其实并不复杂,下面请跟我们来输入一些公式。
假设A列自A2起是身份证号(15位或18位)。
1、身份证号全部改为18位,输入数组公式:=IF(LEN(A2)=15,REPLACE(A2,7,,19)&MID("10X98765432",MOD(SUM(MID(REPLACE(A2,7 ,,19),ROW(INDIRECT("1:17")),1)*2^(18-ROW(INDIRECT("1:17")))),11)+1,1),A2)注意:数组公式输入方法:输入公式后不要按回车,而是按Ctrl+Shift+Enter。
2、身份证号全部改为15位,输入公式:=IF(LEN(A2)=15,A2,LEFT(REPLACE(A2,7,2,),15))3、计算出生日期:=IF(A2"",TEXT((LEN(A2)=15)*19&MID(A2,7,6+(LEN(A2)=18)*2),"#-00-00")+0,)4、判断性别:=IF(A2"",IF(MOD(RIGHT(LEFT(A2,17)),2),"男","女"),)最终结果如图:身份证15位升18位的算法2006年11月08日星期三13:25身份证15位升18位的算法现在新的身份证已经从15位升到了18位了,很多软件都可能用到身份证的输入、校验的工作,关于新身份证的编码似乎文章很少,我发现现在的身份证校验码居然可能是英文字母x(其实这个X是罗马字母,表示10的意思),为什么用字母呢?谁知道?起码电话上数字键就输不进去新的号码。
(现在的办法是使用*替代,好在还有#*2个键),我发现有很多网友问这个问题,所以整理了一下重新贴出来,但是不适用于100岁以上的老人。
身份证编码规则

当今的身份证号码有15和18位之分。
1985年我国实行居民身份证制度,当时签发的身份证号码是15位的,1999年签发的身份证由于年份的扩展(由两位变为四位)和末尾加了效验码,就成了18位。
这两种身份证号码将在相当长的一段时期内共存。
两种身份证号码的含义如下:18位的身份证号码:510104************(1)1~6位为地区代码,其中1、2位数为各省级政府的代码(四川省为51),3、4位数为地、市级政府的代码(成都市为01),5、6位数为县、区级政府代码(锦江区为04)。
(2)7~10位为出生年份(4位),如1963(3)11~12位为出生月份,如07(4)13~14位为出生日期,如17(5)第15~17位为顺序号,为县、区级政府所辖派出所的分配码,每个派出所分配码位10个连续号码,例如“020—029”,其中单数为男性分配码,双数为女性分配码,如遇同年同月同日有两人以上时顺延第二、第三、第四、第五个分配码。
(4)18位为效验位(识别码),通过复杂公式算出,普遍采用计算机自动生成。
15位的身份证号码:(1)1~6位为地区代码(2)7~8位为出生年份(2位),9~10位为出生月份,11~12位为出生日期(3)第13~15位为顺序号,并能够判断性别,奇数为男,偶数为女第一位:代表你在哪个大区。
其中1为华北区,2为东北区,3为华东区,4为中南区,5为西南区,6为西北区。
第二位:代表你所在的省份在你所在大区的排序。
身份证号前两位加一起就能看清你所在的省份。
比如在华北大区中,11为北京,12为天津,13为河北,14为山西,15为内蒙。
再比如东北大区中,21为辽宁,22为吉林,23为黑龙江。
第三位和第四位:是你所在城市在你所在省的一个排序。
比如在辽宁省,01为沈阳,02为大连,03为鞍山,04为抚顺,05为本溪,06为丹东,07为锦州,08为营口,09为阜新,10为营口,11为盘锦,12为铁岭,13为朝阳,14为葫芦岛。
18位身份证号编制规则

18位身份证号编制规则一、身份证号码执行标准:18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》。
GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称“社会保障号码”更名为“公民身份号码”,另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。
二、编码规则:公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。
排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码,可以用字母表示如为ABCDEFYYYYMMDDXXXR。
其含义如下:1. 地址码(ABCDEF):表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T22 60的规定执行。
2. 出生日期码(YYYYMMDD):表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日分别用4位、2位(不足两位加0)、2(同上)位数字表示,之间不用分隔符。
3. 顺序码(XXX):表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
4.校验码(R),一位数字,通过前17位数字根据一定计算得出。
三、关于地址码含义的详细解释:身份证前六位是地区代码,我们用ABCDEF表示。
代码的解释规则如下:A:国内区域1 华北三省二市2 东北三省3 华东六省一市4 华南六省5 西南四省一市6 西北五省7 台湾8 港澳B(或者说是AB,就是前2位):省(直辖市,自治区,特别行政区)代码按照A划定的分区定义省代码,有直辖市的,直辖市列前,其余按离直辖市的距离排序,没有直辖市的,按离北京的远近排序。
具体省(直辖市,自治区,特别行政区)代码如下:11-15 京津冀晋蒙21-23 辽吉黑31-37 沪苏浙皖闽赣鲁41-46 豫鄂湘粤桂琼50-54 渝川贵云藏61-65 陕甘青宁新81-82 港澳CD:城市代码从01开始排,对于直辖市,CD=01表示市辖区,CD=02表示辖县;省的城市代码从省会开始排,比如2101=沈阳2102=大连…… 只有地级城市有独立的城市代码,县级市没有。
身份证号定义说明

当今的身份证号码有15位和18位之分。
1985年我国实行居民身份证制度,当时签发的身份证号码是15位的,1999年签发的身份证由于年份的扩展(由两位变为四位)和末尾加了效验码,就成了18位。
这两种身份证号码将在相当长的一段时期内共存。
两种身份证号码的含义如下:
18位的身份证号码如:130429####%%%%0078
1~6位为地区代码,其中1、2位数为各省级政府的代码,3、4位数为地、市级政府的代码,5、6位数为县、区级政府代码。
如13(河北省)04(邯郸市)29(永年县)
7~14位为出生年月日
15~17位为顺序号,是县、区级政府所辖派出所的分配码,每个派出所分配码为10个连续号码,例如“000-009”或“060-069”,其中单数为男性分配码,双数为女性分配码,如遇同年同月同日有两人以上时顺延第二、第三、第四、第五个分配码。
如:007的就是个男生而且和他同年月日生的男生至少有两个他们的后四位是001* 和003*
18位为效验位(识别码),通过复杂公式算出,普遍采用计算机自动生成。
是前面17位的一种检验代码,如果你改变了前面某个数字而后面的效验代码不响应改变就会被计算软件判断为非法身份正号码。
X也是效验代码的一中
15位的身份证号码:
(1)1~6位为地区代码
(2)7~8位为出生年份(2位),9~10位为出生月份,11~12位为出生日期
(3)第13~15位为顺序号,并能够判断性别,奇数为男,偶数为女。
Excel表格身份证号码提取出生日期的公式

Excel表格身份证号码提取出生日期的公式(B2表示身份证号码所在的列位置)=MID(B2,7,4)&"-"&MID(B2,11,2)&"-"&MID(B2,13,2)回车→向下填充1. Excel表中用身份证号码中取其中的号码用:MID(文本,开始字符,所取字符数);2. 15位身份证号从第7位到第12位是出生年月日,年份用的是2位数。
3. 18位身份证号从第7位到第14位是出生的年月日,年份用的是4位数。
一、提取出生年月:A、15位身份证号码:=MID(B2,7,2)&"-"&MID(B2,9,2)&"-"&MID(B2,11,2) 回车确认即可。
B、18位身份证号码:=MID(B2,7,4)&"年"&MID(B2,11,2)&"月"&MID(B2,13,2)&”日”回车确认即可。
二、提取性别:18位身份证号码:=IF(MOD(MID(B2,17,1),2)=1,"男","女")回车确认即可。
*excel公式中=IF(MOD(MID(E4,17,1),2)=0,"女","男")是什么意思?IF是选择函数,当MOD(MID(E4,17,1),2)=0成立时,单元格显示“女”,否则显示“男”。
MOD是取模函数,即是一个求余函数,求MID(E4,17,1)除以2的余数。
实质是判断MID(E4,17,1)的奇偶性。
MID从一个文本字符串的指定位置开始,截取指定数目的字符。
MID(E4,17,1)是从E4单元格的文本中的第17个字符开始,取一个字符。
三、提取年龄:=year(today())-value(right(left(B2,10),4)) 回车确认即可。
身份证计算年龄公式
身份证计算年龄公式一、引言在现代社会中,身份证是每个人不可或缺的身份证明。
除了可以确认我们的身份外,身份证中还包含了我们的生日信息。
根据身份证中的生日信息,我们可以通过一个简单的计算公式来确定一个人的年龄。
本文将介绍身份证计算年龄的公式及其原理。
二、身份证号码的结构身份证号码是由18位字符组成,其中包含了很多信息,如地区、性别、出生年月日等。
在身份证计算年龄时,我们只需关注出生年月日部分。
具体来说,身份证的出生年月日位于身份证号码的第7至第14位。
其中,出生年份由第7位至第10位组成,月份由第11位至第12位组成,日期由第13位至第14位组成。
三、计算年龄的公式根据身份证的出生年月日信息,我们可以使用以下公式来计算一个人的年龄:年龄 = 当前年份 - 出生年份 - 1需要注意的是,如果当前月份或日期大于或等于出生月份或日期,则直接使用当前年份减去出生年份即可;如果当前月份或日期小于出生月份或日期,则需要减去1,以保证计算的准确性。
四、案例分析为了更好地理解身份证计算年龄公式的使用,我们来看一个具体的案例。
假设某人的身份证号码为:320104************,我们按照上述公式进行计算。
根据身份证号码可得:出生年份为1998,月份为12,日期为17。
当前为2023年,月份为10,日期为5。
根据公式可得年龄计算如下:年龄 = 2023 - 1998 - 1 = 24因此,这个人的年龄为24岁。
五、注意事项在进行身份证计算年龄时,需要注意以下几点:1. 身份证号码必须是18位。
如果是15位身份证号码,需要将其转换为18位后再进行计算。
2. 身份证号码中的出生年月日必须是有效的。
如果身份证号码中的出生年月日格式错误,会导致计算结果不准确。
3. 当前年份必须与计算时的年份一致。
由于每年都有一个新的当前年份,因此在不同年份计算时需要确保使用正确的当前年份。
4. 公式中的年龄为整数,不考虑月份和日期的具体情况。
Java根据身份证号计算年龄,15位身份证号码转18位原理与操作示例
Java根据⾝份证号计算年龄,15位⾝份证号码转18位原理与操作⽰例本⽂实例讲述了Java根据⾝份证号计算年龄,15位⾝份证号码转18位。
分享给⼤家供⼤家参考,具体如下:第⼀代⾝份证:15位⾝份证号码的意义15位⾝份证号码各位的含义:1-2位省、⾃治区、直辖市代码;3-4位地级市、盟、⾃治州代码;5-6位县、县级市、区代码;7-12位出⽣年⽉⽇,⽐如670401代表1967年4⽉1⽇,这是和18位号码的第⼀个区别;13-15位为顺序号,其中15位男为单数,⼥为双数;与18位⾝份证号的第⼆个区别:没有最后⼀位的校验码。
举例:130503 670401 001的含义; 13为河北,05为邢台,03为桥西区,出⽣⽇期为1967年4⽉1⽇,顺序号为001第⼆代⾝份证:18位⾝份证号码的意义 ①前1、2位数字表⽰:所在省份的代码,河南的省份代码是41哦! ②第3、4位数字表⽰:所在城市的代码; ③第5、6位数字表⽰:所在区县的代码; ④第7~14位数字表⽰:出⽣年、⽉、⽇; ⑤第15、16位数字表⽰:所在地的派出所的代码; ⑥第17位数字表⽰性别:奇数表⽰男性,偶数表⽰⼥性; ⑦第18位数字是校检码:也有的说是个⼈信息码,⼀般是随计算机随机产⽣,⽤来检验⾝份证的正确性。
校检码可以是0~9的数字,有时也⽤x表⽰。
举例:130503 19670401 0012这个⾝份证号的含义: 13为河北,05为邢台,03为桥西区,出⽣⽇期为1967年4⽉1⽇,顺序号为001,2为校验码。
根据⾝份证号(18位)提取出⽣年⽉⽇和计算年龄package idcard;import java.text.SimpleDateFormat;import java.util.Date;public class IdCardTest {//根据⾝份证号输出年龄public static int IdNOToAge(String IdNO){int leh = IdNO.length();String dates="";int age = 0;if (leh == 18) {dates = IdNO.substring(6, 10);SimpleDateFormat df = new SimpleDateFormat("yyyy");String year = df.format(new Date());age = Integer.parseInt(year)-Integer.parseInt(dates);}else {System.out.println("出错!⾝份证长度不是18位!");}return age;}public static void main(String[] args) {System.out.println(IdNOToAge("120000************"));System.out.println(IdNOToAge("320000************"));}}15位⾝份证号码转换成18位⾝份证号码package idcard;import java.util.Scanner;public class IDcard15bitTo18bit {public static String[] trans15bitTo18bit(String[] input){String[] result = new String[18];for(int i=0;i<input.length;i++){if(i<=5){result[i] = input[i];}else{result[i+2] = input[i];}}//年份最后两位⼩于17,年份为20XX,否则为19XXif(Integer.valueOf(input[6])<=1&&Integer.valueOf(input[7])<=7){result[6]="2";result[7]="0";}else{result[6]="1";result[7]="9";}//计算最后⼀位String[] xs = {"7","9","10","5","8","4","2","1","6","3","7","9","10","5","8","4","2"}; //前⼗七位乘以系数[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2],int sum = 0;for(int i=0;i<17;i++){sum+= Integer.valueOf(result[i]) * Integer.valueOf(xs[i]);}//对11求余,的余数 0 - 10int rod = sum % 11;//所得余数映射到对应数字即可if(rod==0){ result[17] = "1";}else if(rod==1){ result[17] = "0";}else if(rod==2){ result[17] = "X";}else if(rod==3){ result[17] = "9";}else if(rod==4){ result[17] = "8";}else if(rod==5){ result[17] = "7";}else if(rod==6){ result[17] = "6";}else if(rod==7){ result[17] = "5";}else if(rod==8){ result[17] = "4";}else if(rod==9){ result[17] = "3";}else if(rod==10){ result[17] = "2";}return result;}public static void main(String[] args) {//创建输⼊对象Scanner sc=new Scanner(System.in);//获取⽤户输⼊的字符串String str="";System.out.print("请输⼊您的15位⾝份证号:");str=sc.nextLine();System.out.println("您输⼊的15位⾝份证号为:"+str);if(str.length()==15){String[] input = str.split("");String[] result = trans15bitTo18bit(input);System.out.print("您的18位⾝份证号是:");for(String c:result){System.out.print(c);}}else{System.out.println("不符合格式的⾝份证号!");}}}附:C# 版与VB 版 15位的⾝份证号转为18位操作⽰例C# 版function ID15T18(strTemp){var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');var nTemp = 0, i;if(strTemp.length==15){strTemp = strTemp.substr(0,6) + '19' + strTemp.substr(6,strTemp.length-6);for(i = 0; i < strTemp.length; i ++){nTemp += strTemp.substr(i, 1) * arrInt[i];}strTemp += arrCh[nTemp % 11];}return strTemp;}VB 版privatestringConvert15To18(stringstrTemp){int[]arrInt=newint[]{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};stringarrCh="10X98765432";intnTemp=0;if(strTemp.Length==15){strTemp=strTemp.Substring(0,6)+"19"+strTemp.Substring(6,strTemp.Length-6);for(inti=0;i<strTemp.Length;i++){nTemp+=int.Parse(strTemp.Substring(i,1).ToString())*arrInt[i];}strTemp+=arrCh[nTemp%11];}chardd=arrCh[nTemp%11];returnstrTemp;}PS:这⾥再提供⼀款本站⾝份证归属地信息查询⼯具供⼤家参考:另外,本站在线⼯具⼩程序上也有⼀款功能更加强⼤的⾝份证信息获取⼯具,感兴趣的朋友可以扫描如下⼩程序码查看:更多关于java相关内容感兴趣的读者可查看本站专题:《》、《》、《》和《》希望本⽂所述对⼤家java程序设计有所帮助。
Excel表格中根据身份证号码自动填出生日期、计算年龄
Excel表格中根据身份证号码自动填出生日期、计算年龄18位身份证号码转换成出生日期的函数公式:如果E2中是身份证,在F2中求出出生日期,F2=DATE(MIDB(E2,7,4),MIDB(E2,11,2),MIDB(E2,13,2))自动录入男女:=IF(MOD((IF(LEN(e2)=18,MID(e2,17,1),MID(e2,15,1))),2)=0,"女","男")15/18位都可以的公式:转换出生日期:=IF(LEN(e2)=18,TEXT(MID(e2,7,8),"#-00-00"),"19"&TEXT(MID(e2,7,6),"#-0 0-00"))自动录入男女:=IF(E2="","",IF(MOD(RIGHT(LEFT(E2,17),1),2)=0,"女","男")) 计算年龄(新旧身份证号都可以):=IF(AND(E2=""),"",IF(MIDB(E2,7,2)="19",107-MIDB(E2,9,2),107-MIDB(E2,7 ,2)))WPS表格提取身份证详细信息前些天领导要求统计所有员工的性别、出生日期、年龄等信息,并且要得很急。
而我们单位员工人数众多,短时间内统计相关信息并且输入计算机几乎是不太可能的。
幸好在以前的一份金山表格中我们曾经统计有所有员工的身份证号码,而身份证中正有我们所需要的性别、出生日期、年龄等信息的。
所以,干脆,还是直接在金山表格中从身份证号码提取相关的信息吧。
身份证号放在A2单元格以下的区域。
我们需要从身份证号码中提取性别、出生日期、年龄等相关信息。
由于现在使用的身份证有15位和18位两种。
所以,在提取相关信息时,首先应该判断身份证号码的数字个数,然后再区别不同情况进行相关处理。
身份证的奥秘
身份证的奥秘作者:来源:《小天使·三年级数学人教版》2011年第04期亲爱的小朋友,你一定见过身份证吧,等你长大以后,也将拥有一张属于自己的身份证。
但是,你知道那上面的一串数字,也就是身份证号码,代表的是什么意思吗?现在就让我来向你介绍一下吧。
现在的身份证号码有两种,一种是15位的,一种是18位的。
1985年我国实行居民身份证制度,当时签发的身份证号码是15位的,1999年签发的身份证由于年份的扩展(由两位变为四位)和末尾加了效验码,就成了18位。
这两种身份证号码将在相当长的一段时期内都是有效的哦!18位的身份证号码,如:130429####%%%%0078第1、2位数字:表示所在省份的代码,如13(河北省);第3、4位数字:表示所在城市的代码,如04(邯郸市);第5、6位数字:表示所在区县的代码,如29(永年县);第7~14位数字:表示这个人的出生年月日。
这一点所有的新身份证和旧身份证上都有表示。
但旧身份证上没有年号的前两位数,而新身份证则增加了。
为什么要增加呢?主要原因是为了区分跨世纪人士,以免混淆。
如1918年出生和2018年出生,旧身份证上只有18,而新身份证上则有1918与2018之分。
第15、16位数字表示:所在地的派出所的代码;15位的身份证号码:第1~6位为地区代码;第7、8位为出生年份(两位数);第9、10位为出生月份;第11、12位为出生日期;第13~15位为顺序号,并能够判断性别,单数为男,双数为女。
第17位数字表示性别:单数表示男性,双数表示女性;第18位为效验位(识别码):也可以说是个人信息码,用来检验身份证的正确性。
效验码可以是0~9的数字,有时也用X表示。
问号小子答疑:身份证上的效验位有着重要的作用,可不能随随便便写上去就行了。
效验代码的产生要用到前面的17个数字,再通过复杂公式计算出来。
正因为计算的复杂性,所以一般都是利用计算机来完成的。
它是前面17位的一种检验代码,如果你改变了前面某个数字,而后面的效验代码不相应改变,就会被计算软件判断为非法身份证号码哦!问号小子答疑:哈哈,这位小朋友可真幽默,身份证上怎么会出现未知数呢?目前我国公民第二代身份证号码由18位数字组成,最后一位数字称为检验代码,分别是“0、1、2……10”共11个数字,当检验码为“10”时,为了保证公民身份证号码是18位,所以用“X”表示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
身份证 18位与15位转换 package cn.crediteasep.tools.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Scanner;
import org.apachemons.lang.StringUtils; /** * 身份证工具类 * @author Kobe * @version 2020-08-08 */ public class IdcardUtils extends StringUtils {
/** 中国公民身份证号码最小长度。 */ public static final int CHINA_ID_MIN_LENGTH = 15; /** 中国公民身份证号码最大长度。 */ public static final int CHINA_ID_MAX_LENGTH = 18;
/** 省、直辖市代码表 */ public static final String cityCode[] = { "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" };
/** 每位加权因子 */ public static final int power[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
/** 第18位校检码 */ public static final String verifyCode[] = { "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" }; /** 最低年限 */ public static final int MIN = 1930; public static Map cityCodes = new HashMap(); /** 台湾身份首字母对应数字 */ public static Map twFirstCode = new HashMapInteger>(); /** 香港身份首字母对应数字 */ public static Map hkFirstCode = new HashMapInteger>(); static { cityCodes.put("11", "北京"); cityCodes.put("12", "天津"); cityCodes.put("13", "河北"); cityCodes.put("14", "山西"); cityCodes.put("15", "内蒙古"); cityCodes.put("21", "辽宁"); cityCodes.put("22", "吉林"); cityCodes.put("23", "黑龙江"); cityCodes.put("31", "上海"); cityCodes.put("32", "江苏"); cityCodes.put("33", "浙江"); cityCodes.put("34", "安徽"); cityCodes.put("35", "福建"); cityCodes.put("36", "江西"); cityCodes.put("37", "山东"); cityCodes.put("41", "河南"); cityCodes.put("42", "湖北"); cityCodes.put("43", "湖南"); cityCodes.put("44", "广东"); cityCodes.put("45", "广西"); cityCodes.put("46", "海南"); cityCodes.put("50", "重庆"); cityCodes.put("51", "四川"); cityCodes.put("52", "贵州"); cityCodes.put("53", "云南"); cityCodes.put("54", "西藏"); cityCodes.put("61", "陕西"); cityCodes.put("62", "甘肃"); cityCodes.put("63", "青海"); cityCodes.put("64", "宁夏"); cityCodes.put("65", "新疆"); cityCodes.put("71", "台湾"); cityCodes.put("81", "香港"); cityCodes.put("82", "澳门"); cityCodes.put("91", "国外"); twFirstCode.put("A", 10); twFirstCode.put("B", 11); twFirstCode.put("C", 12); twFirstCode.put("D", 13); twFirstCode.put("E", 14); twFirstCode.put("F", 15); twFirstCode.put("G", 16); twFirstCode.put("H", 17); twFirstCode.put("J", 18); twFirstCode.put("K", 19); twFirstCode.put("L", 20); twFirstCode.put("M", 21); twFirstCode.put("N", 22); twFirstCode.put("P", 23); twFirstCode.put("Q", 24); twFirstCode.put("R", 25); twFirstCode.put("S", 26); twFirstCode.put("T", 27); twFirstCode.put("U", 28); twFirstCode.put("V", 29); twFirstCode.put("X", 30); twFirstCode.put("Y", 31); twFirstCode.put("W", 32); twFirstCode.put("Z", 33); twFirstCode.put("I", 34); twFirstCode.put("O", 35); hkFirstCode.put("A", 1); hkFirstCode.put("B", 2); hkFirstCode.put("C", 3); hkFirstCode.put("R", 18); hkFirstCode.put("U", 21); hkFirstCode.put("Z", 26); hkFirstCode.put("X", 24); hkFirstCode.put("W", 23); hkFirstCode.put("O", 15); hkFirstCode.put("N", 14); }
/** * 将15位身份证号码转换为18位 * @param idCard * 15位身份编码 * @return 18位身份编码 */ public static String conver15CardTo18(String idCard) { String idCard18 = ""; if (idCard.length() != CHINA_ID_MIN_LENGTH) { return null; } if (isNum(idCard)) { // 获掏诞生年月日 String birthday = idCard.substring(6, 12); Date birthDate = null; try { birthDate = new SimpleDateFormat("yyMMdd").parse(birthday); } catch (ParseException e) { e.printStackTrace(); } Calendar cal = Calendar.getInstance(); if (birthDate != null) cal.setTime(birthDate); // 获掏诞生年(完全表现形式,如:2020) String sYear = String.valueOf(cal.get(Calendar.YEAR)); idCard18 = idCard.substring(0, 6) + sYear + idCard.substring(8); // 转换字符数组 char[] cArr = idCard18.toCharArray();