Skip to content

常见问题 (FAQ) ​

身份证号码最后一位是 X 是什么意思? ​

X 是校验码的一种取值。校验码由前 17 位通过 ISO 7064:1983 MOD 11-2 加权算法计算得出,结果为 0~10 共 11 种可能。当结果为 10 时,为保证号码总长 18 位,用罗马数字 X 表示。

本库在比对校验码时统一按大写处理,输入小写 x 同样判定有效:

typescript
isValid('37012519790112881x'); // → true(小写 x 也可通过)

15 位和 18 位身份证有什么区别? ​

15 位是 1999 年之前的旧版号码,18 位是 GB 11643-1999 规定的现行版本,差异有两点:

  1. 出生年份:15 位用 2 位年份(YYMMDD,默认 19 世纪),18 位用 4 位完整年份(YYYYMMDD)
  2. 校验码:15 位没有校验码,18 位末位是加权校验码

toEighteen() 按标准规则升级:年份补 19、追加计算的校验码:

typescript
toEighteen('110101900101001'); // → '110101199001011001'

验证通过就代表这个身份证号码真实存在吗? ​

不代表。 本库执行的是离线格式校验,包括:

  • 长度与字符规则(checkBaseFormat)
  • 省份行政区划代码有效性(checkProvince)
  • 出生日期合法性(含闰年、大小月)
  • 校验码一致性(MOD 11-2)

一个"通过验证"的号码只说明它符合编码规则,无法确认该号码是否真实签发、是否对应某个真实的人。实名核验需要对接公安部一所等官方渠道,任何纯前端库都做不到。

支持港澳台地区的号码吗? ​

支持。地址码前两位按 GB/T 2260 扩展代码校验:

代码地区
71台湾省
81香港特别行政区
82澳门特别行政区

出生日期的校验规则是什么? ​

按公历严格校验,包括:

  • 月份必须在 1~12 之间
  • 日期不超过当月实际天数(4/6/9/11 月 30 天,其余 31 天)
  • 2 月按闰年规则:闰年 29 天,平年 28 天(能被 4 整除但不能被 100 整除,或能被 400 整除)

因此 20000229(2000 年闰年)合法,而 19000229(1900 年平年)不合法。

parse() 返回的年龄是怎么计算的? ​

按周岁计算:当前年份减去出生年份,若今年生日尚未到则减 1。

typescript
parse('622922197808118498').age; // 生日已过 → 当年周岁;生日未到 → 周岁 - 1

注意年龄是调用时刻的动态值,不同日期调用可能返回不同结果。

我的身份证号会被上传吗? ​

不会。 本库无任何网络请求,所有计算(包括在线体验页面)均在你的浏览器本地完成。库本身 0 依赖,你可以审查每一行源码。

为什么在 TypeScript 里引入报类型错误? ​

库自带类型声明(dist/index.d.ts),无需安装 @types/*。如遇问题,请确认:

  1. tsconfig.json 中 moduleResolution 为 bundler 或 node16/nodenext(推荐)
  2. 使用 ES Module 引入方式:import { isValid } from 'china-id-card'

更多问题 ​

到 GitHub Issues 提问或反馈。

基于 GB 11643-1999 标准