身份证校验加解析,这个Java工具类8个方法一次搞定

简介: 本工具类专为中国大陆18位身份证设计,支持合法性校验、出生日期解析、周岁计算、性别/地区码/省级码提取及末位校验码生成,严格遵循国标,自动处理空格与小写x,要求JDK 17+。

📋 目录

一、工具类功能

校验中国大陆 18 位身份证号并解析出出生日期、性别、周岁、地区码与省份码,也能只按前 17 位算出应有的末位校验码,末位小写 x 与首尾空白自动处理。

二、所需环境

JDK 17或以上

三、方法与调用示例(按需调用)

🔢 方法序号:1

🎯 方法用途:

  • 一句话判 18 位居民身份证号是否合法,不合法也只给 false
  • 注册、实名校验这类「先拦一道再说」的入口用它,别用解析方法当校验

🧩 方法定义:public static boolean isValid(String idCard)

🗣️ 入参解释:public static boolean isValid(身份证号码)

📤 返回值解释:boolean,合法返回 true,其余一律 false

💡 边界口径:

  • 依次核对 18 位格式、出生日期是否真实存在、出生年份是否不早于 1900 且不晚于今天、末位校验码是否一致
  • 日期用 STRICT 解析,能拦掉 2 月 30 日、2021 年 2 月 29 日这种不存在的生日
  • 首尾空白会被去掉,末位小写 x 统一按大写 X 处理
  • 不校验前 6 位地区码是否被真实划设,15 位一代身份证不支持
  • null、空白、长度不对都返回 false,不抛异常

🧪 方法示例:

  • isValid(SAMPLE_FEMALE) 与 isValid(SAMPLE_MALE) 都拿到 true
  • 末位小写的 isValid("11010519491231002x") 拿到 true
  • 两侧带空白的号码拿到 true,空白被先去掉
  • 校验码算对但日期不存在的两个号码拿到 false、false
  • 少一位与 15 位一代证分别拿到 false、false
  • isValid(null) 拿到 false

🔢 方法序号:2

🎯 方法用途:

  • 从号码的 7-14 位取出生日期,返回 LocalDate
  • 算年龄、判断是否成年、按生日做营销时用

🧩 方法定义:public static LocalDate getBirthDate(String idCard)

🗣️ 入参解释:public static LocalDate getBirthDate(身份证号码)

📤 返回值解释:LocalDate,号码里写的出生日期

💡 边界口径:

  • 号码非法直接抛 IllegalArgumentException,不做静默兜底
  • 末位小写 x 一样能解析,不需要调用方先规范化
  • 只做 STRICT 日期解析,不存在的生日在号码非法这条上就失败了

🧪 方法示例:

  • getBirthDate("11010519491231002x") 拿到 1949-12-31
  • getBirthDate(SAMPLE_MALE) 拿到 1990-03-07
  • getBirthDate("11010520210229001X") 抛 非法的身份证号码: 11010520210229001X

🔢 方法序号:3

🎯 方法用途:

  • 按今天的日期算周岁,生日没过会减一岁
  • 成年判断、年龄区间筛选这类即时计算用它

🧩 方法定义:public static int getAge(String idCard)

🗣️ 入参解释:public static int getAge(身份证号码)

📤 返回值解释:int,截至今天的周岁

💡 边界口径:

  • 周岁按日历算,不是「年份相减」,生日没过不算长一岁
  • 参考日期是 JVM 默认时区的今天,跨时区要自己传参考日期
  • 号码非法同样抛 IllegalArgumentException

🧪 方法示例:

  • getAge(SAMPLE_MALE) 拿到 36,1990 年 3 月 7 日生,当天已过生日

🔢 方法序号:4

🎯 方法用途:

  • 按指定参考日期算周岁,测试和「截至某日年龄」的口径都用它
  • 结果需要可复现时别用无参考日期版,天天下飘

🧩 方法定义:public static int getAge(String idCard, LocalDate refDate)

🗣️ 入参解释:public static int getAge(身份证号码, 参考日期)

📤 返回值解释:int,截至参考日期的周岁

💡 边界口径:

  • 生日当天算满岁,生日前一天还是上一岁
  • 参考日期早于出生日期时按 Period 语义给负数,异常数据要调用方自己判
  • refDate 传 null 抛 NullPointerException,号码非法抛 IllegalArgumentException

🧪 方法示例:

  • getAge(SAMPLE_MALE, LocalDate.of(2026, 3, 6)) 拿到 35 周岁,生日前一天
  • getAge(SAMPLE_MALE, LocalDate.of(2026, 3, 7)) 拿到 36 周岁,生日当天满岁
  • getAge(SAMPLE_MALE, LocalDate.of(2027, 3, 6)) 拿到 36 周岁,下一个生日前夜
  • getAge(SAMPLE_MALE, null) 抛 refDate 不能为 null

🔢 方法序号:5

🎯 方法用途:

  • 按第 17 位顺序码的奇偶取性别,奇数为男、偶数为女
  • 填充用户资料、做人群分布统计时用

🧩 方法定义:public static String getGender(String idCard)

🗣️ 入参解释:public static String getGender(身份证号码)

📤 返回值解释:String,只给 男 或 女 两个字

💡 边界口径:

  • 只看第 17 位,不看姓名与其他信息
  • 号码非法抛 IllegalArgumentException
  • 返回的是中文文案,要存代码值自己映射

🧪 方法示例:

  • getGender(SAMPLE_FEMALE) 拿到 女,第 17 位是偶数
  • getGender(SAMPLE_MALE) 拿到 男

🔢 方法序号:6

🎯 方法用途:

  • 取号码前 6 位地区码原样返回
  • 按户籍地做地域统计、区划码回填时用

🧩 方法定义:public static String getAreaCode(String idCard)

🗣️ 入参解释:public static String getAreaCode(身份证号码)

📤 返回值解释:String,前 6 位地区码字符串

💡 边界口径:

  • 原样截取,不查区划字典,也不判断是否真实划设过
  • 号码非法抛 IllegalArgumentException
  • 保留前导结构,需要省份码再走下一个方法

🧪 方法示例:

  • getAreaCode(SAMPLE_MALE) 拿到 110101

🔢 方法序号:7

🎯 方法用途:

  • 取号码前 2 位省级行政区划码
  • 按省聚合、做省份下拉回填时用这一版

🧩 方法定义:public static String getProvinceCode(String idCard)

🗣️ 入参解释:public static String getProvinceCode(身份证号码)

📤 返回值解释:String,前 2 位省级码

💡 边界口径:

  • 只截前两位,不做省份名称映射,字典自己维护
  • 号码非法抛 IllegalArgumentException
  • 与地区码是前缀关系,11 对应 110101 的省级段

🧪 方法示例:

  • getProvinceCode(SAMPLE_MALE) 拿到 11

🔢 方法序号:8

🎯 方法用途:

  • 按 ISO 7064:1983 MOD 11-2 由前 17 位算出应有的末位校验码
  • 生成测试号码、或者对端只给了前 17 位要补全时用

🧩 方法定义:public static char calculateCheckCode(CharSequence first17)

🗣️ 入参解释:public static char calculateCheckCode(前17位数字串)

📤 返回值解释:char,校验码字符,取值是 0-9 或 X

💡 边界口径:

  • 长度不是 17 位、或含非数字字符都抛 IllegalArgumentException
  • 余值为 2 时校验码是 X,返回值可能是字母
  • 只算校验位,不判断出生日期是否合法

🧪 方法示例:

  • calculateCheckCode("51010519700101001") 拿到 6,拼成 18 位后 isValid 是 true
  • 国标样例的前 17 位算出 X,与号码末位一致
  • 传 15 位串抛 前 17 位长度不正确: 15
  • 前 17 位里夹一个字母抛 前 17 位必须全部为数字

四、工具类源码(可直接复制)

📦 源码文件

相关文章
|
10天前
|
JavaScript API iOS开发
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(DSH)是DeepSeek于2026年开源的MIT协议AI Agent框架,支持插件化组装模型、工具、沙箱与UI,兼容主流大模型。本文提供免Node.js的桌面端安装包(Win/macOS),含详细图文教程及热门插件推荐。
3915 42
|
9天前
|
Linux 开发工具 iOS开发
Codex保姆级教程(下载+安装+登录+使用,含所有版本,2026最新)
Codex是OpenAI推出的开源AI编程智能体,本地运行,可理解整个代码库,支持自然语言指令改代码、执行命令、跑测试、修Bug,兼容Win/macOS/Linux。(239字)
3586 13
|
4天前
|
云安全 人工智能 安全
|
10天前
|
iOS开发 Docker MacOS
【2026实测】Docker Desktop下载、安装、汉化、配置教程(附官网安装包)
Docker Desktop 是 Docker 官方推出的桌面容器管理工具,集成引擎、CLI、图形界面与 Kubernetes,支持 Win/macOS/Linux。2026 最新版 4.88.1 强化 ARM 原生运行、镜像加速及资源可视化,附中文汉化与国内镜像配置指南。
1794 6
|
10天前
|
安全 算法 定位技术
《高性价比人生指南》完整原版:普通人用最少的资源,过好这一生的底层逻辑~How To Live Better
📖《高性价比人生指南》是一份基于实证、拒绝焦虑的生存手册,倡导以“人生时薪”为视角,重新计算时间、金钱与精力的成本与收益。它不承诺逆袭,只教人算清账:省下的钱若耗掉时间便亏;买体验比买物品更值;睡眠是最高杠杆的健康投资;关系贵在情绪价值而非表面热络;学习重在改变行为而非自我安慰。核心理念:用低成本、高回报的微小行动,换取长期的选择权——不是成为谁,而是掌控自己人生的主动权。
2095 4
|
云安全 安全 网络安全
|
4天前
|
Linux 开发工具 iOS开发
2026最新codex下载安装保姆级使用教程(下载+安装+登录+使用,含所有历史版本)
本文详解OpenAI Codex国内快速上手指南:提供Win/macOS/Linux全平台免安装包、npm/Homebrew等多方式安装、账号/API Key双登录、简体中文切换,覆盖下载、安装、汉化、使用及高频避坑(如微软商店失败、npm超时等),10分钟即可跑通。
765 1
|
23天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
4077 56

热门文章

最新文章