java 根据省份证号-判断省份-性别-生日

}

public int getDay() {

return day;

}

public void setDay(int day) {

this.day = day;

}

public String getGender() {

return gender;

}

public void setGender(String gender) {

this.gender = gender;

}

public Date getBirthday() {

return birthday;

}

public void setBirthday(Date birthday) {

this.birthday = birthday;

}

public IdcardValidator() {

}

public String toString() {

return “省份:” + this.province + “-性别:” + this.gender + “,出生日期:” + new SimpleDateFormat(“yyyy-MM-dd”).format(this.birthday);

}

private Map<String, String> cityCodeMap = new HashMap<String, String>() {

{

this.put(“11”, “北京”);

this.put(“12”, “天津”);

this.put(“13”, “河北”);

this.put(“14”, “山西”);

this.put(“15”, “内蒙古”);

this.put(“21”, “辽宁”);

this.put(“22”, “吉林”);

this.put(“23”, “黑龙江”);

this.put(“31”, “上海”);

this.put(“32”, “江苏”);

this.put(“33”, “浙江”);

this.put(“34”, “安徽”);

this.put(“35”, “福建”);

this.put(“36”, “江西”);

this.put(“37”, “山东”);

this.put(“41”, “河南”);

this.put(“42”, “湖北”);

this.put(“43”, “湖南”);

this.put(“44”, “广东”);

this.put(“45”, “广西”);

this.put(“46”, “海南”);

this.put(“50”, “重庆”);

this.put(“51”, “四川”);

this.put(“52”, “贵州”);

this.put(“53”, “云南”);

this.put(“54”, “西藏”);

this.put(“61”, “陕西”);

this.put(“62”, “甘肃”);

this.put(“63”, “青海”);

this.put(“64”, “宁夏”);

this.put(“65”, “新疆”);

this.put(“71”, “台湾”);

this.put(“81”, “香港”);

this.put(“82”, “澳门”);

this.put(“91”, “国外”);

}

};

private IdcardValidator validator = null;

/**

  • 077

  • 通过构造方法初始化各个成员属性

  • 078

*/

public IdcardValidator(String idcard) {

try {

validator = new IdcardValidator();

if (validator.isValidatedAllIdcard(idcard)) {

if (idcard.length() == 15) {

idcard = validator.convertIdcarBy15bit(idcard);

}

// 获取省份

String provinceId = idcard.substring(0, 2);

Set key = this.cityCodeMap.keySet();

for (String id : key) {

if (id.equals(provinceId)) {

this.province = this.cityCodeMap.get(id);

break;

}

}

// 获取性别

String id17 = idcard.substring(16, 17);

if (Integer.parseInt(id17) % 2 != 0) {

this.gender = “男”;

} else {

this.gender = “女”;

}

// 获取出生日期

String birthday = idcard.substring(6, 14);

Date birthdate = new SimpleDateFormat(“yyyyMMdd”)

.parse(birthday);

this.birthday = birthdate;

GregorianCalendar currentDay = new GregorianCalendar();

currentDay.setTime(birthdate);

this.year = currentDay.get(Calendar.YEAR);

this.month = currentDay.get(Calendar.MONTH) + 1;

this.day = currentDay.get(Calendar.DAY_OF_MONTH);

}

} catch (Exception e) {

e.printStackTrace();

}

}

protected String codeAndCity[][] = {{“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”, “国外”}};

private 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”};

// 每位加权因子

private int power[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};

// 第18位校检码

private String verifyCode[] = {“1”, “0”, “X”, “9”, “8”, “7”, “6”, “5”,

“4”, “3”, “2”};

/**

  • 072

  • 验证所有的身份证的合法性

  • 073

  • 074

  • @param idcard 075

  • @return 076

*/

public boolean isValidatedAllIdcard(String idcard) {

if (idcard.length() == 15) {

idcard = this.convertIdcarBy15bit(idcard);

}

return this.isValidate18Idcard(idcard);

}

/**

  • 085

  • 086

  • 判断18位身份证的合法性

  • 087

  • 088

  • 根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。

  • 089

  • 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

  • 090

  • 091

  • 顺序码: 表示在同一地址码所标识的区域范围内,对同年、同月、同 日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配 给女性。

  • 092

  • 093

  • 094

  • 1.前1、2位数字表示:所在省份的代码; 2.第3、4位数字表示:所在城市的代码; 3.第5、6位数字表示:所在区县的代码;

  • 095

  • 4.第7~14位数字表示:出生年、月、日; 5.第15、16位数字表示:所在地的派出所的代码;

  • 096

  • 6.第17位数字表示性别:奇数表示男性,偶数表示女性;

  • 097

  • 7.第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生,用来检验身份证的正确性。校检码可以是0~9的数字,有时也用x表示。

  • 098

  • 099

  • 100

  • 第十八位数字(校验码)的计算方法为: 1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4

  • 101

  • 2 1 6 3 7 9 10 5 8 4 2

  • 102

  • 103

  • 104

  • 2.将这17位数字和系数相乘的结果相加。

  • 105

  • 106

  • 107

  • 3.用加出来和除以11,看余数是多少?

  • 108

  • 109

  • 4.余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3

  • 110

  • 2。

  • 111

  • 112

  • 5.通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。

  • 113

  • 114

  • 115

*/

public boolean isValidate18Idcard(String idcard) {

// 非18位为假

if (idcard.length() != 18) {

return false;

}

// 获取前17位

String idcard17 = idcard.substring(0, 17);

// 获取第18位

String idcard18Code = idcard.substring(17, 18);

char c[] = null;

String checkCode = “”;

// 是否都为数字

if (isDigital(idcard17)) {

c = idcard17.toCharArray();

} else {

return false;

}

if (null != c) {

int bit[] = new int[idcard17.length()];

bit = converCharToInt©;

int sum17 = 0;

sum17 = getPowerSum(bit);

// 将和值与11取模得到余数进行校验码判断

checkCode = getCheckCodeBySum(sum17);

if (null == checkCode) {

return false;

}

// 将身份证的第18位与算出来的校码进行匹配,不相等就为假

if (!idcard18Code.equalsIgnoreCase(checkCode)) {

return false;

}

}

return true;

}

/**

  • 159

  • 验证15位身份证的合法性,该方法验证不准确,最好是将15转为18位后再判断,该类中已提供。

  • 160

  • 161

  • @param idcard 162

  • @return 163

*/

public boolean isValidate15Idcard(String idcard) {

// 非15位为假

if (idcard.length() != 15) {

return false;

}

// 是否全都为数字

if (isDigital(idcard)) {

String provinceid = idcard.substring(0, 2);

String birthday = idcard.substring(6, 12);

int year = Integer.parseInt(idcard.substring(6, 8));

int month = Integer.parseInt(idcard.substring(8, 10));

int day = Integer.parseInt(idcard.substring(10, 12));

// 判断是否为合法的省份

boolean flag = false;

for (String id : cityCode) {

if (id.equals(provinceid)) {

flag = true;

break;

}

}

if (!flag) {

return false;

}

// 该身份证生出日期在当前日期之后时为假

Date birthdate = null;

try {

birthdate = new SimpleDateFormat(“yyMMdd”).parse(birthday);

} catch (ParseException e) {

e.printStackTrace();

}

if (birthdate == null || new Date().before(birthdate)) {

return false;

}

// 判断是否为合法的年份

GregorianCalendar curDay = new GregorianCalendar();

int curYear = curDay.get(Calendar.YEAR);

int year2bit = Integer.parseInt(String.valueOf(curYear)

.substring(2));

// 判断该年份的两位表示法,小于50的和大于当前年份的,为假

if ((year < 50 && year > year2bit)) {

return false;

}

// 判断是否为合法的月份

if (month < 1 || month > 12) {

return false;

}

// 判断是否为合法的日期

boolean mflag = false;

curDay.setTime(birthdate); // 将该身份证的出生日期赋于对象curDay

switch (month) {

case 1:

case 3:

case 5:

case 7:

case 8:

case 10:

case 12:

mflag = (day >= 1 && day <= 31);

break;

case 2: // 公历的2月非闰年有28天,闰年的2月是29天。

if (curDay.isLeapYear(curDay.get(Calendar.YEAR))) {

mflag = (day >= 1 && day <= 29);

} else {

mflag = (day >= 1 && day <= 28);

}

break;

case 4:

case 6:

case 9:

case 11:

mflag = (day >= 1 && day <= 30);

break;

}

if (!mflag) {

return false;

}

} else {

return false;

}

return true;

}

/**

  • 253

  • 将15位的身份证转成18位身份证

  • 254

  • 255

  • @param idcard 256

  • @return 257

*/

public String convertIdcarBy15bit(String idcard) {

String idcard17 = null;

// 非15位身份证

if (idcard.length() != 15) {

return null;

}

if (isDigital(idcard)) {

// 获取出生年月日

String birthday = idcard.substring(6, 12);

Date birthdate = null;

try {

birthdate = new SimpleDateFormat(“yyMMdd”).parse(birthday);

} catch (ParseException e) {

e.printStackTrace();

}

Calendar cday = Calendar.getInstance();

cday.setTime(birthdate);

String year = String.valueOf(cday.get(Calendar.YEAR));

idcard17 = idcard.substring(0, 6) + year + idcard.substring(8);

char c[] = idcard17.toCharArray();

String checkCode = “”;

if (null != c) {

int bit[] = new int[idcard17.length()];

// 将字符数组转为整型数组

bit = converCharToInt©;

int sum17 = 0;

sum17 = getPowerSum(bit);

// 获取和值与11取模得到余数进行校验码

checkCode = getCheckCodeBySum(sum17);

// 获取不到校验位

if (null == checkCode) {

return null;

}

// 将前17位与第18位校验码拼接

idcard17 += checkCode;

}

} else { // 身份证包含数字

return null;

}

return idcard17;

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
setTime(birthdate);

String year = String.valueOf(cday.get(Calendar.YEAR));

idcard17 = idcard.substring(0, 6) + year + idcard.substring(8);

char c[] = idcard17.toCharArray();

String checkCode = “”;

if (null != c) {

int bit[] = new int[idcard17.length()];

// 将字符数组转为整型数组

bit = converCharToInt©;

int sum17 = 0;

sum17 = getPowerSum(bit);

// 获取和值与11取模得到余数进行校验码

checkCode = getCheckCodeBySum(sum17);

// 获取不到校验位

if (null == checkCode) {

return null;

}

// 将前17位与第18位校验码拼接

idcard17 += checkCode;

}

} else { // 身份证包含数字

return null;

}

return idcard17;

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-zaxCk6mR-1715706335664)]

[外链图片转存中…(img-d5mXYehK-1715706335665)]

[外链图片转存中…(img-nhcyYVlM-1715706335665)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值