Java根據(jù)身份證號計算年齡,15位身份證號碼轉(zhuǎn)18位原理與操作示例
本文實例講述了Java根據(jù)身份證號計算年齡,15位身份證號碼轉(zhuǎn)18位。分享給大家供大家參考,具體如下:
第一代身份證:15位身份證號碼的意義
15位身份證號碼各位的含義:
1-2位省、自治區(qū)、直轄市代碼;
3-4位地級市、盟、自治州代碼;
5-6位縣、縣級市、區(qū)代碼;
7-12位出生年月日,比如670401代表1967年4月1日,這是和18位號碼的第一個區(qū)別;
13-15位為順序號,其中15位男為單數(shù),女為雙數(shù);
與18位身份證號的第二個區(qū)別:沒有最后一位的校驗碼。舉例:
130503 670401 001的含義; 13為河北,05為邢臺,03為橋西區(qū),出生日期為1967年4月1日,順序號為001
第二代身份證:18位身份證號碼的意義
?、偾?、2位數(shù)字表示:所在省份的代碼,河南的省份代碼是41哦!
?、诘?、4位數(shù)字表示:所在城市的代碼;
?、鄣?、6位數(shù)字表示:所在區(qū)縣的代碼;
?、艿?~14位數(shù)字表示:出生年、月、日;
?、莸?5、16位數(shù)字表示:所在地的派出所的代碼;
⑥第17位數(shù)字表示性別:奇數(shù)表示男性,偶數(shù)表示女性;
?、叩?8位數(shù)字是校檢碼:也有的說是個人信息碼,一般是隨計算機隨機產(chǎn)生,用來檢驗身份證的正確性。校檢碼可以是0~9的數(shù)字,有時也用x表示。舉例:
130503 19670401 0012這個身份證號的含義: 13為河北,05為邢臺,03為橋西區(qū),出生日期為1967年4月1日,順序號為001,2為校驗碼。
根據(jù)身份證號(18位)提取出生年月日和計算年齡
package idcard;
import java.text.SimpleDateFormat;
import java.util.Date;
public class IdCardTest {
//根據(jù)身份證號輸出年齡
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("120000197802150561"));
System.out.println(IdNOToAge("32000019951110538X"));
}
}
15位身份證號碼轉(zhuǎn)換成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,否則為19XX
if(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"};
//前十七位乘以系數(shù)[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求余,的余數(shù) 0 - 10
int rod = sum % 11;
//所得余數(shù)映射到對應(yīng)數(shù)字即可
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) {
//創(chuàng)建輸入對象
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位的身份證號轉(zhuǎn)為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:這里再提供一款本站身份證歸屬地信息查詢工具供大家參考:
身份證歸屬地信息在線查詢:
http://tools.jb51.net/bianmin/sfz
另外,本站在線工具小程序上也有一款功能更加強大的身份證信息獲取工具,感興趣的朋友可以掃描如下小程序碼查看:

更多關(guān)于java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java字符與字符串操作技巧總結(jié)》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計有所幫助。
相關(guān)文章
SpringBoot?如何使用sharding?jdbc進行分庫分表
這篇文章主要介紹了SpringBoot?如何使用sharding?jdbc進行分庫分表,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
Java實現(xiàn)統(tǒng)計文檔中關(guān)鍵字出現(xiàn)的次數(shù)
這篇文章主要為大家分享了利用Java語言實現(xiàn)統(tǒng)計關(guān)鍵字在文檔中出現(xiàn)的次數(shù)的方法,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2022-05-05
SpringBoot連接MySql數(shù)據(jù)庫的原理及代碼示例
SpringBoot是一款流行的Java開發(fā)框架,它可以輕松地連接各種類型的數(shù)據(jù)庫,包括關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫,本文將介紹SpringBoot是如何連接數(shù)據(jù)庫的,包括其原理和代碼示例,需要的朋友可以參考下2023-07-07
解決@Cacheable在同一個類中方法調(diào)用不起作用的問題
這篇文章主要介紹了解決@Cacheable在同一個類中方法調(diào)用不起作用的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
java讀取文件:char的ASCII碼值=65279,顯示是一個空字符的解決
這篇文章主要介紹了java讀取文件:char的ASCII碼值=65279,顯示是一個空字符的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08
application.yml文件中如何開啟mybatis自動駝峰映射
這篇文章主要介紹了application.yml文件中開啟mybatis自動駝峰映射的方法,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08
詳解Java的TCP/IP編程學(xué)習(xí)--基于定界符的成幀
這篇文章主要介紹了Java的TCP/IP編程學(xué)習(xí)--基于定界符的成幀,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04

