常见问题 (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 规定的现行版本,差异有两点:
- 出生年份:15 位用 2 位年份(
YYMMDD,默认 19 世纪),18 位用 4 位完整年份(YYYYMMDD) - 校验码: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/*。如遇问题,请确认:
tsconfig.json中moduleResolution为bundler或node16/nodenext(推荐)- 使用 ES Module 引入方式:
import { isValid } from 'china-id-card'
更多问题
到 GitHub Issues 提问或反馈。