1 changed files with 0 additions and 355 deletions
@ -1,355 +0,0 @@ |
|||||
package com.epmet.plugin.power.utils; |
|
||||
|
|
||||
import org.apache.commons.lang3.StringUtils; |
|
||||
|
|
||||
import java.io.Serializable; |
|
||||
import java.text.ParseException; |
|
||||
import java.text.SimpleDateFormat; |
|
||||
import java.time.LocalDate; |
|
||||
import java.util.Date; |
|
||||
import java.util.Hashtable; |
|
||||
import java.util.regex.Matcher; |
|
||||
import java.util.regex.Pattern; |
|
||||
|
|
||||
/** |
|
||||
* 身份证号工具 |
|
||||
* |
|
||||
* @author yujintao |
|
||||
* @email yujintao@elink-cn.com |
|
||||
* @date 2019/9/7 13:11 |
|
||||
*/ |
|
||||
public class IdentityNoUtils implements Serializable { |
|
||||
|
|
||||
/** |
|
||||
* 15位身份证号 |
|
||||
*/ |
|
||||
private static final Integer FIFTEEN_ID_CARD = 15; |
|
||||
/** |
|
||||
* 18位身份证号 |
|
||||
*/ |
|
||||
private static final Integer EIGHTEEN_ID_CARD = 18; |
|
||||
/** |
|
||||
* 数字格式校验 |
|
||||
*/ |
|
||||
private static Pattern NUMBER_PATTERN = Pattern.compile("[0-9]*"); |
|
||||
/** |
|
||||
* 日期格式校验 |
|
||||
*/ |
|
||||
private static Pattern DATE_PATTERN = Pattern.compile("^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\\s(((0?[0-9])|([1-2][0-3]))\\:([0-5]?[0-9])((\\s)|(\\:([0-5]?[0-9])))))?$"); |
|
||||
/** |
|
||||
* 18位身份证中最后一位校验码 |
|
||||
*/ |
|
||||
private final static char[] VERIFY_CODE = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'}; |
|
||||
/** |
|
||||
* 18位身份证中,各个数字的生成校验码时的权值 |
|
||||
*/ |
|
||||
private final static int[] VERIFY_CODE_WEIGHT = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; |
|
||||
|
|
||||
/** |
|
||||
* 根据身份证号获取性别 0女;1男 |
|
||||
* |
|
||||
* @param IDCard 完整身份证号码 |
|
||||
* @return java.lang.String |
|
||||
* @author work@yujt.net.cn |
|
||||
* @date 2019/9/20 14:26 |
|
||||
*/ |
|
||||
public static String getSex(String IDCard) { |
|
||||
if (StringUtils.isNotBlank(IDCard)) { |
|
||||
if (IDCard.length() == FIFTEEN_ID_CARD) { |
|
||||
if (Integer.parseInt(IDCard.substring(14, 15)) % 2 == 0) { |
|
||||
return sexEnum.FEMALE.value; |
|
||||
} else { |
|
||||
return sexEnum.MALE.value; |
|
||||
} |
|
||||
} else if (IDCard.length() == EIGHTEEN_ID_CARD) { |
|
||||
if (Integer.parseInt(IDCard.substring(16).substring(0, 1)) % 2 == 0) { |
|
||||
return sexEnum.FEMALE.value; |
|
||||
} else { |
|
||||
return sexEnum.MALE.value; |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
return null; |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* 根据身份证号获取年龄 |
|
||||
* |
|
||||
* @param IDCard 完整身份证号码 |
|
||||
* @return java.lang.Integer |
|
||||
* @author work@yujt.net.cn |
|
||||
* @date 2019/9/20 14:26 |
|
||||
*/ |
|
||||
public static Integer getAge(String IDCard) { |
|
||||
int age; |
|
||||
LocalDate now = LocalDate.now(); |
|
||||
int nowYear = now.getYear(); |
|
||||
int nowMonth = now.getMonthValue(); |
|
||||
int cardYear = 0; |
|
||||
int cardMonth = 0; |
|
||||
if (StringUtils.isNotBlank(IDCard) && isValid(IDCard)) { |
|
||||
if (IDCard.length() == FIFTEEN_ID_CARD) { |
|
||||
// 身份证上的年份(15位身份证为1980年前的)
|
|
||||
String uyear = "19" + IDCard.substring(6, 8); |
|
||||
cardYear = Integer.parseInt(uyear); |
|
||||
// 身份证上的月份
|
|
||||
String uyue = IDCard.substring(8, 10); |
|
||||
cardMonth = Integer.parseInt(uyue); |
|
||||
} else if (IDCard.length() == EIGHTEEN_ID_CARD) { |
|
||||
// 身份证上的年份
|
|
||||
String year = IDCard.substring(6).substring(0, 4); |
|
||||
cardYear = Integer.parseInt(year); |
|
||||
// 身份证上的月份
|
|
||||
String yue = IDCard.substring(10).substring(0, 2); |
|
||||
cardMonth = Integer.parseInt(yue); |
|
||||
} |
|
||||
} |
|
||||
// 当前月份大于用户出身的月份表示已过生日
|
|
||||
if (cardMonth <= nowMonth) { |
|
||||
age = nowYear - cardYear + 1; |
|
||||
// 当前用户还没过生
|
|
||||
} else { |
|
||||
age = nowYear - cardYear; |
|
||||
} |
|
||||
return age; |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* 根据身份证号获取出生日期 |
|
||||
* |
|
||||
* @param IDCard 完整身份证号码 |
|
||||
* @return java.lang.String |
|
||||
* @author work@yujt.net.cn |
|
||||
* @date 2019/9/20 14:26 |
|
||||
*/ |
|
||||
public static String getBirthday(String IDCard) { |
|
||||
String year = ""; |
|
||||
String month = ""; |
|
||||
String day = ""; |
|
||||
if (StringUtils.isNotBlank(IDCard)) { |
|
||||
//15位身份证号
|
|
||||
if (IDCard.length() == FIFTEEN_ID_CARD) { |
|
||||
// 身份证上的年份(15位身份证为1980年前的)
|
|
||||
year = "19" + IDCard.substring(6, 8); |
|
||||
//身份证上的月份
|
|
||||
month = IDCard.substring(8, 10); |
|
||||
//身份证上的日期
|
|
||||
day = IDCard.substring(10, 12); |
|
||||
//18位身份证号
|
|
||||
} else if (IDCard.length() == EIGHTEEN_ID_CARD) { |
|
||||
// 身份证上的年份
|
|
||||
year = IDCard.substring(6).substring(0, 4); |
|
||||
// 身份证上的月份
|
|
||||
month = IDCard.substring(10).substring(0, 2); |
|
||||
//身份证上的日期
|
|
||||
day = IDCard.substring(12).substring(0, 2); |
|
||||
} |
|
||||
} |
|
||||
return year + "-" + month + "-" + day; |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* 身份证验证是否有效 |
|
||||
* |
|
||||
* @param id 号码内容 |
|
||||
* @return boolean |
|
||||
* @author |
|
||||
* @date |
|
||||
*/ |
|
||||
public static boolean isValid(String id) { |
|
||||
Boolean validResult = true; |
|
||||
//校验长度只能为15或18
|
|
||||
int len = id.length(); |
|
||||
if (len != FIFTEEN_ID_CARD && len != EIGHTEEN_ID_CARD) { |
|
||||
validResult = false; |
|
||||
} |
|
||||
//校验生日
|
|
||||
if (!validDate(id)) { |
|
||||
validResult = false; |
|
||||
} |
|
||||
return validResult; |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* 校验生日 |
|
||||
* |
|
||||
* @param id |
|
||||
* @return |
|
||||
*/ |
|
||||
private static boolean validDate(String id) { |
|
||||
try { |
|
||||
String birth = id.length() == FIFTEEN_ID_CARD ? "19" + id.substring(6, 12) : id.substring(6, 14); |
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); |
|
||||
Date birthDate = sdf.parse(birth); |
|
||||
if (!birth.equals(sdf.format(birthDate))) { |
|
||||
return false; |
|
||||
} |
|
||||
} catch (ParseException e) { |
|
||||
return false; |
|
||||
} |
|
||||
return true; |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* 验证身份证号码,验证通过返回null |
|
||||
* |
|
||||
* @param idStr 完整身份证号码 |
|
||||
* @return java.lang.String |
|
||||
* @author work@yujt.net.cn |
|
||||
* @date 2019/9/20 14:26 |
|
||||
*/ |
|
||||
public static String IdentityNoVerification(String idStr) { |
|
||||
String iDCardNo = null; |
|
||||
//判断号码的长度 15位或18位
|
|
||||
if (idStr.length() != FIFTEEN_ID_CARD && idStr.length() != EIGHTEEN_ID_CARD) { |
|
||||
return "身份证号码长度应该为15位或18位"; |
|
||||
} |
|
||||
if (idStr.length() == EIGHTEEN_ID_CARD) { |
|
||||
iDCardNo = idStr.substring(0, 17); |
|
||||
} else if (idStr.length() == FIFTEEN_ID_CARD) { |
|
||||
iDCardNo = idStr.substring(0, 6) + "19" + idStr.substring(6, 15); |
|
||||
} |
|
||||
if (isStrNum(iDCardNo) == false) { |
|
||||
return "身份证15位号码都应为数字;18位号码除最后一位外,都应为数字"; |
|
||||
} |
|
||||
//判断出生年月
|
|
||||
int year = Integer.parseInt(iDCardNo.substring(6, 10)); |
|
||||
String strMonth = iDCardNo.substring(10, 12); |
|
||||
String strDay = iDCardNo.substring(12, 14); |
|
||||
|
|
||||
String birthDay = year + "-" + strMonth + "-" + strDay; |
|
||||
if (isStrDate(birthDay) == false) { |
|
||||
return "身份证生日无效"; |
|
||||
} |
|
||||
LocalDate now = LocalDate.now(); |
|
||||
if ((now.getYear() - year) > 150 || now.isBefore(LocalDate.parse(birthDay))) { |
|
||||
return "身份证生日不在有效范围"; |
|
||||
} |
|
||||
int month = Integer.parseInt(strMonth); |
|
||||
if (month > 12 || month == 0) { |
|
||||
return "身份证月份无效"; |
|
||||
} |
|
||||
int day = Integer.parseInt(strDay); |
|
||||
if (day > 31 || day == 0) { |
|
||||
return "身份证日期无效"; |
|
||||
} |
|
||||
//判断地区码
|
|
||||
Hashtable h = GetAreaCode(); |
|
||||
if (h.get(iDCardNo.substring(0, 2)) == null) { |
|
||||
return "身份证地区编码错误"; |
|
||||
} |
|
||||
//判断最后一位
|
|
||||
int theLastOne = 0; |
|
||||
for (int i = 0; i < 17; i++) { |
|
||||
theLastOne = theLastOne + Integer.parseInt(String.valueOf(iDCardNo.charAt(i))) * VERIFY_CODE_WEIGHT[i]; |
|
||||
} |
|
||||
int modValue = theLastOne % 11; |
|
||||
char strVerifyCode = VERIFY_CODE[modValue]; |
|
||||
iDCardNo = iDCardNo + strVerifyCode; |
|
||||
if (idStr.length() == EIGHTEEN_ID_CARD && !iDCardNo.equals(idStr)) { |
|
||||
return "身份证无效,不是合法的身份证号码"; |
|
||||
} |
|
||||
return null; |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* 地区代码 |
|
||||
* |
|
||||
* @return Hashtable |
|
||||
*/ |
|
||||
private static Hashtable GetAreaCode() { |
|
||||
Hashtable<String, String> hashtable = new Hashtable<>(); |
|
||||
hashtable.put("11", "北京"); |
|
||||
hashtable.put("12", "天津"); |
|
||||
hashtable.put("13", "河北"); |
|
||||
hashtable.put("14", "山西"); |
|
||||
hashtable.put("15", "内蒙古"); |
|
||||
hashtable.put("21", "辽宁"); |
|
||||
hashtable.put("22", "吉林"); |
|
||||
hashtable.put("23", "黑龙江"); |
|
||||
hashtable.put("31", "上海"); |
|
||||
hashtable.put("32", "江苏"); |
|
||||
hashtable.put("33", "浙江"); |
|
||||
hashtable.put("34", "安徽"); |
|
||||
hashtable.put("35", "福建"); |
|
||||
hashtable.put("36", "江西"); |
|
||||
hashtable.put("37", "山东"); |
|
||||
hashtable.put("41", "河南"); |
|
||||
hashtable.put("42", "湖北"); |
|
||||
hashtable.put("43", "湖南"); |
|
||||
hashtable.put("44", "广东"); |
|
||||
hashtable.put("45", "广西"); |
|
||||
hashtable.put("46", "海南"); |
|
||||
hashtable.put("50", "重庆"); |
|
||||
hashtable.put("51", "四川"); |
|
||||
hashtable.put("52", "贵州"); |
|
||||
hashtable.put("53", "云南"); |
|
||||
hashtable.put("54", "西藏"); |
|
||||
hashtable.put("61", "陕西"); |
|
||||
hashtable.put("62", "甘肃"); |
|
||||
hashtable.put("63", "青海"); |
|
||||
hashtable.put("64", "宁夏"); |
|
||||
hashtable.put("65", "新疆"); |
|
||||
hashtable.put("71", "台湾"); |
|
||||
hashtable.put("81", "香港"); |
|
||||
hashtable.put("82", "澳门"); |
|
||||
hashtable.put("91", "国外"); |
|
||||
return hashtable; |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* 判断字符串是否为数字 |
|
||||
* |
|
||||
* @param str |
|
||||
* @return boolean |
|
||||
* @author work@yujt.net.cn |
|
||||
* @date 2019/9/20 13:58 |
|
||||
*/ |
|
||||
private static boolean isStrNum(String str) { |
|
||||
Matcher isNum = NUMBER_PATTERN.matcher(str); |
|
||||
if (isNum.matches()) { |
|
||||
return true; |
|
||||
} else { |
|
||||
return false; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* 判断字符串是否为日期格式 |
|
||||
* |
|
||||
* @param strDate |
|
||||
* @return boolean |
|
||||
* @author work@yujt.net.cn |
|
||||
* @date 2019/9/20 13:57 |
|
||||
*/ |
|
||||
public static boolean isStrDate(String strDate) { |
|
||||
Matcher m = DATE_PATTERN.matcher(strDate); |
|
||||
if (m.matches()) { |
|
||||
return true; |
|
||||
} else { |
|
||||
return false; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
enum sexEnum { |
|
||||
/** |
|
||||
* 暂停 |
|
||||
*/ |
|
||||
FEMALE("0"), |
|
||||
/** |
|
||||
* 正常 |
|
||||
*/ |
|
||||
MALE("1"); |
|
||||
|
|
||||
private String value; |
|
||||
|
|
||||
sexEnum(String value) { |
|
||||
this.value = value; |
|
||||
} |
|
||||
|
|
||||
public String value() { |
|
||||
return value; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
} |
|
Loading…
Reference in new issue