第一代身份證: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("120000197802150561"));
System.out.println(IdNOToAge("32000019951110538X"));
}
}
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,否則為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"};
//前十七位乘以系數[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 - 10
int 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("不符合格式的身份證号!");
}
}
}