This commit is contained in:
Looly 2022-05-07 08:24:59 +08:00
parent 41bd03fa25
commit 662bfbe007
2 changed files with 42 additions and 53 deletions

View File

@ -16,12 +16,12 @@ import java.util.Map;
import java.util.Objects; import java.util.Objects;
/** /**
* 身份证相关工具类<br> * 身份证相关工具类参考标准GB 11643-1999<br>
* see <a href="https://www.oschina.net/code/snippet_1611_2881">https://www.oschina.net/code/snippet_1611_2881</a> * 标准描述见<a href="http://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=080D6FBF2BB468F9007657F26D60013E">http://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=080D6FBF2BB468F9007657F26D60013E</a>
* *
* <p> * <p>
* 本工具并没有对行政区划代码做校验如有需求请参阅2018年10 * 本工具并没有对行政区划代码做校验如有需求请参阅2020年12
* <a href="http://www.mca.gov.cn/article/sj/xzqh/2018/201804-12/20181011221630.html">http://www.mca.gov.cn/article/sj/xzqh/2018/201804-12/20181011221630.html</a> * <a href="http://www.mca.gov.cn/article/sj/xzqh/2020/20201201.html">http://www.mca.gov.cn/article/sj/xzqh/2020/20201201.html</a>
* </p> * </p>
* *
* @author Looly * @author Looly
@ -118,7 +118,8 @@ public class IdcardUtil {
} }
/** /**
* 将15位身份证号码转换为18位 * 将15位身份证号码转换为18位<br>
* 15位身份证号码遵循GB 11643-1989标准
* *
* @param idCard 15位身份编码 * @param idCard 15位身份编码
* @return 18位身份编码 * @return 18位身份编码
@ -422,17 +423,6 @@ public class IdcardUtil {
return sum % 11 == 0; return sum % 11 == 0;
} }
/**
* 根据身份编号获取生日只支持15或18位身份证号码
*
* @param idcard 身份编号
* @return 生日(yyyyMMdd)
* @see #getBirth(String)
*/
public static String getBirthByIdCard(final String idcard) {
return getBirth(idcard);
}
/** /**
* 根据身份编号获取生日只支持15或18位身份证号码 * 根据身份编号获取生日只支持15或18位身份证号码
* *
@ -458,8 +448,8 @@ public class IdcardUtil {
* @return 日期 * @return 日期
*/ */
public static DateTime getBirthDate(final String idCard) { public static DateTime getBirthDate(final String idCard) {
final String birthByIdCard = getBirthByIdCard(idCard); final String birth = getBirth(idCard);
return null == birthByIdCard ? null : DateUtil.parse(birthByIdCard, DatePattern.PURE_DATE_FORMAT); return null == birth ? null : DateUtil.parse(birth, DatePattern.PURE_DATE_FORMAT);
} }
/** /**
@ -468,8 +458,8 @@ public class IdcardUtil {
* @param idcard 身份编号 * @param idcard 身份编号
* @return 年龄 * @return 年龄
*/ */
public static int getAgeByIdCard(final String idcard) { public static int getAge(final String idcard) {
return getAgeByIdCard(idcard, DateUtil.date()); return getAge(idcard, DateUtil.date());
} }
/** /**
@ -479,9 +469,8 @@ public class IdcardUtil {
* @param dateToCompare 以此日期为界计算年龄 * @param dateToCompare 以此日期为界计算年龄
* @return 年龄 * @return 年龄
*/ */
public static int getAgeByIdCard(final String idcard, final Date dateToCompare) { public static int getAge(final String idcard, final Date dateToCompare) {
final String birth = getBirthByIdCard(idcard); return DateUtil.age(getBirthDate(idcard), dateToCompare);
return DateUtil.age(DateUtil.parse(birth, "yyyyMMdd"), dateToCompare);
} }
/** /**
@ -490,7 +479,7 @@ public class IdcardUtil {
* @param idcard 身份编号 * @param idcard 身份编号
* @return 生日(yyyy) * @return 生日(yyyy)
*/ */
public static Short getYearByIdCard(String idcard) { public static Short getBirthYear(String idcard) {
final int len = idcard.length(); final int len = idcard.length();
if (len < CHINA_ID_MIN_LENGTH) { if (len < CHINA_ID_MIN_LENGTH) {
return null; return null;
@ -506,7 +495,7 @@ public class IdcardUtil {
* @param idcard 身份编号 * @param idcard 身份编号
* @return 生日(MM) * @return 生日(MM)
*/ */
public static Short getMonthByIdCard(String idcard) { public static Short getBirthMonth(String idcard) {
final int len = idcard.length(); final int len = idcard.length();
if (len < CHINA_ID_MIN_LENGTH) { if (len < CHINA_ID_MIN_LENGTH) {
return null; return null;
@ -522,7 +511,7 @@ public class IdcardUtil {
* @param idcard 身份编号 * @param idcard 身份编号
* @return 生日(dd) * @return 生日(dd)
*/ */
public static Short getDayByIdCard(String idcard) { public static Short getBirthDay(String idcard) {
final int len = idcard.length(); final int len = idcard.length();
if (len < CHINA_ID_MIN_LENGTH) { if (len < CHINA_ID_MIN_LENGTH) {
return null; return null;
@ -538,7 +527,7 @@ public class IdcardUtil {
* @param idcard 身份编号 * @param idcard 身份编号
* @return 性别(1 : 0 : ) * @return 性别(1 : 0 : )
*/ */
public static int getGenderByIdCard(String idcard) { public static int getGender(String idcard) {
Assert.notBlank(idcard); Assert.notBlank(idcard);
final int len = idcard.length(); final int len = idcard.length();
if (len < CHINA_ID_MIN_LENGTH) { if (len < CHINA_ID_MIN_LENGTH) {
@ -559,7 +548,7 @@ public class IdcardUtil {
* @return 省份编码 * @return 省份编码
* @since 5.7.2 * @since 5.7.2
*/ */
public static String getProvinceCodeByIdCard(final String idcard) { public static String getProvinceCode(final String idcard) {
final int len = idcard.length(); final int len = idcard.length();
if (len == CHINA_ID_MIN_LENGTH || len == CHINA_ID_MAX_LENGTH) { if (len == CHINA_ID_MIN_LENGTH || len == CHINA_ID_MAX_LENGTH) {
return idcard.substring(0, 2); return idcard.substring(0, 2);
@ -573,8 +562,8 @@ public class IdcardUtil {
* @param idcard 身份编码 * @param idcard 身份编码
* @return 省份名称 * @return 省份名称
*/ */
public static String getProvinceByIdCard(final String idcard) { public static String getProvince(final String idcard) {
final String code = getProvinceCodeByIdCard(idcard); final String code = getProvinceCode(idcard);
if (StrUtil.isNotBlank(code)) { if (StrUtil.isNotBlank(code)) {
return CITY_CODES.get(code); return CITY_CODES.get(code);
} }
@ -588,7 +577,7 @@ public class IdcardUtil {
* @param idcard 身份编码 * @param idcard 身份编码
* @return 地市级编码 * @return 地市级编码
*/ */
public static String getCityCodeByIdCard(final String idcard) { public static String getCityCode(final String idcard) {
final int len = idcard.length(); final int len = idcard.length();
if (len == CHINA_ID_MIN_LENGTH || len == CHINA_ID_MAX_LENGTH) { if (len == CHINA_ID_MIN_LENGTH || len == CHINA_ID_MAX_LENGTH) {
return idcard.substring(0, 4); return idcard.substring(0, 4);
@ -604,7 +593,7 @@ public class IdcardUtil {
* @return 地市级编码 * @return 地市级编码
* @since 5.8.0 * @since 5.8.0
*/ */
public static String getDistrictCodeByIdCard(final String idcard) { public static String getDistrictCode(final String idcard) {
final int len = idcard.length(); final int len = idcard.length();
if (len == CHINA_ID_MIN_LENGTH || len == CHINA_ID_MAX_LENGTH) { if (len == CHINA_ID_MIN_LENGTH || len == CHINA_ID_MAX_LENGTH) {
return idcard.substring(0, 6); return idcard.substring(0, 6);
@ -723,11 +712,11 @@ public class IdcardUtil {
* @param idcard 身份证号码 * @param idcard 身份证号码
*/ */
public Idcard(final String idcard) { public Idcard(final String idcard) {
this.provinceCode = IdcardUtil.getProvinceCodeByIdCard(idcard); this.provinceCode = IdcardUtil.getProvinceCode(idcard);
this.cityCode = IdcardUtil.getCityCodeByIdCard(idcard); this.cityCode = IdcardUtil.getCityCode(idcard);
this.birthDate = IdcardUtil.getBirthDate(idcard); this.birthDate = IdcardUtil.getBirthDate(idcard);
this.gender = IdcardUtil.getGenderByIdCard(idcard); this.gender = IdcardUtil.getGender(idcard);
this.age = IdcardUtil.getAgeByIdCard(idcard); this.age = IdcardUtil.getAge(idcard);
} }
/** /**

View File

@ -47,49 +47,49 @@ public class IdcardUtilTest {
} }
@Test @Test
public void getAgeByIdCardTest() { public void getAgeTest() {
final DateTime date = DateUtil.parse("2017-04-10"); final DateTime date = DateUtil.parse("2017-04-10");
final int age = IdcardUtil.getAgeByIdCard(ID_18, date); final int age = IdcardUtil.getAge(ID_18, date);
Assert.assertEquals(age, 38); Assert.assertEquals(age, 38);
final int age2 = IdcardUtil.getAgeByIdCard(ID_15, date); final int age2 = IdcardUtil.getAge(ID_15, date);
Assert.assertEquals(age2, 28); Assert.assertEquals(age2, 28);
} }
@Test @Test
public void getBirthByIdCardTest() { public void getBirthTest() {
final String birth = IdcardUtil.getBirthByIdCard(ID_18); final String birth = IdcardUtil.getBirth(ID_18);
Assert.assertEquals(birth, "19781216"); Assert.assertEquals(birth, "19781216");
final String birth2 = IdcardUtil.getBirthByIdCard(ID_15); final String birth2 = IdcardUtil.getBirth(ID_15);
Assert.assertEquals(birth2, "19880730"); Assert.assertEquals(birth2, "19880730");
} }
@Test @Test
public void getProvinceByIdCardTest() { public void getProvinceTest() {
final String province = IdcardUtil.getProvinceByIdCard(ID_18); final String province = IdcardUtil.getProvince(ID_18);
Assert.assertEquals(province, "江苏"); Assert.assertEquals(province, "江苏");
final String province2 = IdcardUtil.getProvinceByIdCard(ID_15); final String province2 = IdcardUtil.getProvince(ID_15);
Assert.assertEquals(province2, "内蒙古"); Assert.assertEquals(province2, "内蒙古");
} }
@Test @Test
public void getCityCodeByIdCardTest() { public void getCityCodeTest() {
final String codeByIdCard = IdcardUtil.getCityCodeByIdCard(ID_18); final String code = IdcardUtil.getCityCode(ID_18);
Assert.assertEquals("3210", codeByIdCard); Assert.assertEquals("3210", code);
} }
@Test @Test
public void getDistrictCodeByIdCardTest() { public void getDistrictCodeTest() {
final String codeByIdCard = IdcardUtil.getDistrictCodeByIdCard(ID_18); final String code = IdcardUtil.getDistrictCode(ID_18);
Assert.assertEquals("321083", codeByIdCard); Assert.assertEquals("321083", code);
} }
@Test @Test
public void getGenderByIdCardTest() { public void getGenderTest() {
final int gender = IdcardUtil.getGenderByIdCard(ID_18); final int gender = IdcardUtil.getGender(ID_18);
Assert.assertEquals(1, gender); Assert.assertEquals(1, gender);
} }