/******************************************************************************* * Copyright ( c ) 2016 ZhiJieYun Corporation. All Rights Reserved. * * This software is the confidential and proprietary information of ZhiJieYun * Corporation ("Confidential Information"). You shall not disclose such * Confidential Information and shall use it only in accordance with the terms * of the license agreement you entered into with ZhiJieYun Corporation or a ZhiJieYun * authorized reseller (the "License Agreement"). ZhiJieYun may make changes to the * Confidential Information from time to time. Such Confidential Information may * contain errors. * * EXCEPT AS EXPLICITLY SET FORTH IN THE LICENSE AGREEMENT, ZhiJieYun DISCLAIMS ALL * WARRANTIES, COVENANTS, REPRESENTATIONS, INDEMNITIES, AND GUARANTEES WITH * RESPECT TO SOFTWARE AND DOCUMENTATION, WHETHER EXPRESS OR IMPLIED, WRITTEN OR * ORAL, STATUTORY OR OTHERWISE INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A * PARTICULAR PURPOSE. ZhiJieYun DOES NOT WARRANT THAT END USER'S USE OF THE * SOFTWARE WILL BE UNINTERRUPTED, ERROR FREE OR SECURE. * * ZhiJieYun SHALL NOT BE LIABLE TO END USER, OR ANY OTHER PERSON, CORPORATION OR * ENTITY FOR INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL * DAMAGES, OR DAMAGES FOR LOSS OF PROFITS, REVENUE, DATA OR USE, WHETHER IN AN * ACTION IN CONTRACT, TORT OR OTHERWISE, EVEN IF ZhiJieYun HAS BEEN ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. ZhiJieYun' TOTAL LIABILITY TO END USER SHALL NOT * EXCEED THE AMOUNTS PAID FOR THE ZhiJieYun SOFTWARE BY END USER DURING THE PRIOR * TWELVE (12) MONTHS FROM THE DATE IN WHICH THE CLAIM AROSE. BECAUSE SOME * STATES OR JURISDICTIONS DO NOT ALLOW LIMITATION OR EXCLUSION OF CONSEQUENTIAL * OR INCIDENTAL DAMAGES, THE ABOVE LIMITATION MAY NOT APPLY TO END USER. * * Copyright version 1.0 *******************************************************************************/ package com.ydtech.utils; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; /** *
* 类说明: 1、号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码, * 三位数字顺序码和一位数字校验码。 2、地址码(前六位数) 表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。 * 3、出生日期码(第七位至十四位) 表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。 * 4、顺序码(第十五位至十七位) 表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。 * 5、校验码(第十八位数) * * @version 1.00 * @author:aidy */ public class IDCardUtils { /** *
* 身份证号码合法性校验。
*
* @return boolean
* @author: aidy
*/
public static boolean idCardValidate(String idStr) {
String errorInfo = null;// 记录错误信息
String[] ValCodeArr = {"1", "0", "x", "9", "8", "7", "6", "5", "4", "3", "2"};
String[] Wi = {"7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2"};
// String[] Checker = {"1","9","8","7","6","5","4","3","2","1","1"};
String ai = "";
if (StringUtils.isNullOrEmpty(idStr)) {
return false;
} else {
if (idStr.length() != 15 && idStr.length() != 18) {
errorInfo = "号码长度应该为15位或18位。";
return false;
}
// ================ 数字 除最后一位都为数字 ================
if (idStr.length() == 18) {
ai = idStr.substring(0, 17);
} else if (idStr.length() == 15) {
ai = idStr.substring(0, 6) + "19" + idStr.substring(6, 15);
}
if (isNumeric(ai) == false) {
errorInfo = "15位号码都应为数字 ; 18位号码除最后一位外,都应为数字。";
return false;
}
// =======================(end)========================
// ================ 出生年月是否有效 ================
String strYear = ai.substring(6, 10);// 年份
String strMonth = ai.substring(10, 12);// 月份
String strDay = ai.substring(12, 14);// 月份
String birthday = ai.substring(6, 14);
if (!isDate(birthday)) {
errorInfo = "生日无效。";
return false;
}
GregorianCalendar gc = new GregorianCalendar();
SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");
try {
if ((gc.get(Calendar.YEAR) - Integer.parseInt(strYear)) > 150
|| (gc.getTime().getTime() - s.parse(strYear + "-" + strMonth + "-" + strDay).getTime()) < 0) {
errorInfo = "生日不在有效范围。";
return false;
}
} catch (NumberFormatException e) {
e.printStackTrace();
return false;
} catch (ParseException e) {
e.printStackTrace();
return false;
}
if (Integer.parseInt(strMonth) > 12 || Integer.parseInt(strMonth) == 0) {
errorInfo = "月份无效";
return false;
}
if (Integer.parseInt(strDay) > 31 || Integer.parseInt(strDay) == 0) {
errorInfo = "日期无效";
return false;
}
// =====================(end)=====================
// ================ 地区码时候有效 ================
Hashtable
* 判断字符串是否为数字
*
* @return boolean
* @author: aidy
*/
private static boolean isNumeric(String str) {
Pattern pattern = Pattern.compile("[0-9]*");
Matcher isNum = pattern.matcher(str);
if (isNum.matches()) {
return true;
} else {
return false;
}
/**//*
* 判断一个字符时候为数字 if(Character.isDigit(str.charAt(0))) { return true; }
* else { return false; }
*/
}
/**
*
* 判断字符串是否为日期格式
*
* @return boolean
* @author: aidy
*/
public static boolean isDate(String strDate) {
String DatePattern = "^(?:([0-9]{4}(?:(?:0?[1,3-9]|1[0-2])(?:29|30)|((?:0?[13578]|1[02])-31)))|"
+ "([0-9]{4}(?:0?[1-9]|1[0-2])(?:0?[1-9]|1\\d|2[0-8]))|"
+ "(((?:(\\d\\d(?:0[48]|[2468][048]|[13579][26]))|"
+ "(?:0[48]00|[2468][048]00|[13579][26]00))0?229)))$";
Pattern pattern = Pattern.compile(DatePattern);
Matcher m = pattern.matcher(strDate);
if (m.matches()) {
return true;
} else {
return false;
}
}
/**
*
* 在判定已经是正确的身份证号码之后,查找出身份证所在地区。
*
* @return String
* @author: aidy
*/
public String GetArea(String idCard) {
Hashtable
* 在判定已经是正确的身份证号码之后,查找出此人性别(1:男;2:女)。
*
* @return String
* @author: aidy
*/
public static String GetSex(String idCard) {
String sex = "";
if (idCard.length() == 15)
sex = idCard.substring(idCard.length() - 3, idCard.length());
if (idCard.length() == 18)
sex = idCard.substring(idCard.length() - 4, idCard.length() - 1);
// System.out.println(sex);
int sexNum = Integer.parseInt(sex) % 2;
if (sexNum == 0) {
return "FEMALE";
}
return "MALE";
}
/**
* 永诚使用返回对应编码
* 在判定已经是正确的身份证号码之后,查找出此人性别(1:男;2:女)。
*
* @return String
* @author: aidy
*/
public static String GetYcSex(String idCard) {
String sex = "";
if (idCard.length() == 15)
sex = idCard.substring(idCard.length() - 3, idCard.length());
if (idCard.length() == 18)
sex = idCard.substring(idCard.length() - 4, idCard.length() - 1);
// System.out.println(sex);
int sexNum = Integer.parseInt(sex) % 2;
if (sexNum == 0) {
return "106002";
}
return "106001";
}
/**
*
* 在判定已经是正确的身份证号码之后,查找出此人出生日期
*
* @return String
* @author: aidy
*/
public static String GetBirthday(String idCard) {
String Ain = "";
if (idCard.length() == 18) {
Ain = idCard.substring(0, 17);
} else if (idCard.length() == 15) {
Ain = idCard.substring(0, 6) + "19" + idCard.substring(6, 15);
}
// ================ 出生年月是否有效 ================
String strYear = Ain.substring(6, 10);// 年份
String strMonth = Ain.substring(10, 12);// 月份
String strDay = Ain.substring(12, 14);// 日期
return strYear + "-" + strMonth + "-" + strDay;
}
/**
*
* 设置地区编码
*
* @return Hashtable
* @author: aidy
*/
private static Hashtable