diff --git a/CHANGELOG.md b/CHANGELOG.md
index 02db9de33..5820371f8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,7 @@
### 🐣新特性
### 🐞Bug修复
+* 【core 】 IdcardUtil#getCityCodeByIdCard位数问题(issue#2224@Github)
-------------------------------------------------------------------------------------------------------------
diff --git a/hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java
index 4fa1201f3..7c760583f 100644
--- a/hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java
@@ -580,15 +580,32 @@ public class IdcardUtil {
}
/**
- * 根据身份编号获取市级编码,只支持15或18位身份证号码
+ * 根据身份编号获取地市级编码,只支持15或18位身份证号码
+ * 获取编码为4位
*
* @param idcard 身份编码
- * @return 市级编码。
+ * @return 地市级编码
*/
public static String getCityCodeByIdCard(String idcard) {
int len = idcard.length();
if (len == CHINA_ID_MIN_LENGTH || len == CHINA_ID_MAX_LENGTH) {
- return idcard.substring(0, 5);
+ return idcard.substring(0, 4);
+ }
+ return null;
+ }
+
+ /**
+ * 根据身份编号获取区县级编码,只支持15或18位身份证号码
+ * 获取编码为6位
+ *
+ * @param idcard 身份编码
+ * @return 地市级编码
+ * @since 5.8.0
+ */
+ public static String getDistrictCodeByIdCard(String idcard) {
+ int len = idcard.length();
+ if (len == CHINA_ID_MIN_LENGTH || len == CHINA_ID_MAX_LENGTH) {
+ return idcard.substring(0, 6);
}
return null;
}
diff --git a/hutool-core/src/test/java/cn/hutool/core/util/IdcardUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/IdcardUtilTest.java
index b9cd747a2..8afba95a1 100644
--- a/hutool-core/src/test/java/cn/hutool/core/util/IdcardUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/util/IdcardUtilTest.java
@@ -78,7 +78,13 @@ public class IdcardUtilTest {
@Test
public void getCityCodeByIdCardTest() {
String codeByIdCard = IdcardUtil.getCityCodeByIdCard(ID_18);
- Assert.assertEquals("32108", codeByIdCard);
+ Assert.assertEquals("3210", codeByIdCard);
+ }
+
+ @Test
+ public void getDistrictCodeByIdCardTest() {
+ String codeByIdCard = IdcardUtil.getDistrictCodeByIdCard(ID_18);
+ Assert.assertEquals("321083", codeByIdCard);
}
@Test