前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >还能这样?第三方没返回性别和年龄,我用这个办法做到了

还能这样?第三方没返回性别和年龄,我用这个办法做到了

作者头像
大风写全栈
发布2025-02-05 15:19:03
发布2025-02-05 15:19:03
2500
代码可运行
举报
文章被收录于专栏:锤子代码锤子代码
运行总次数:0
代码可运行

有个项目需要对接第三方,会定期返回用户的信息。

但里面缺少性别和年龄,按说这个不算啥。

架不住公司有要求,必须保证数据完整。

做过乙方的都懂,有时候让甲方改点东西难如登天。

下决心自己搞,不算太难的事(无奈╮(╯▽╰)╭)。

这样做能行吗?

行,一定行。

思路就是用身份证号,去计算用户的性别和年龄。

年龄需要注意一下,最好是返回给前端的时候动态计算(也可以缓存起来动态算,或者让前台自己算),这里只是展示结果。

Java实现:

代码语言:javascript
代码运行次数:0
复制
/**
 * 根据身份证号计算年龄和性别
 *
 *
 * @param idCard 身份证号
 * @return 对象
 */
public Result calculateAgeGender(String idCard) {
    if (idCard == null || (idCard.length() != 15 && idCard.length() != 18)) {
        return null;
    }

    String birthDateStr;
    int genderCode;

    if (idCard.length() == 15) {
        birthDateStr = "19" + idCard.substring(6, 12);
        genderCode = Integer.parseInt(idCard.substring(14, 15));
    } else {
        birthDateStr = idCard.substring(6, 14);
        genderCode = Integer.parseInt(idCard.substring(16, 17));
    }

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
    LocalDate birthDate = LocalDate.parse(birthDateStr, formatter);
    LocalDate currentDate = LocalDate.now();
    Period period = Period.between(birthDate, currentDate);
    String gender = genderCode % 2 == 0 ? "女" : "男";

    return new Result(period.getYears(), gender);
}

// 返回性别和年龄.
public class Result {
    private int age;
    private String gender;

    // get..
    // set..
}

如果是前端自己计算?别急,也准备好了:

代码语言:javascript
代码运行次数:0
复制
// 使用原生js.
function calculateAgeGender(idCard) {
    if (!idCard || (idCard.length !== 15 && idCard.length !== 18)) {
        return null;
    }
    let birthDateStr;
    let genderCode;
    if (idCard.length === 15) {
        birthDateStr = "19" + idCard.slice(6, 12);
        genderCode = parseInt(idCard.charAt(14), 10);
    } else {
        birthDateStr = idCard.slice(6, 14);
        genderCode = parseInt(idCard.charAt(16), 10);
    }
    const birthDate = new Date(`${birthDateStr.slice(0, 4)}-${birthDateStr.slice(4, 6)}-${birthDateStr.slice(6, 8)}`);
    const today = new Date();
    let age = today.getFullYear() - birthDate.getFullYear();
    const monthDiff = today.getMonth() - birthDate.getMonth();
    if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthDate.getDate())) {
        age--;
    }
    const gender = genderCode % 2 === 0 ? '女' : '男';
    return { age, gender };
}

如果你用了dayjs,那就太好了,下面是dayjs的版本:

代码语言:javascript
代码运行次数:0
复制
const dayjs = require('dayjs');
function calculateAgeGender(idCard) {
    if (!idCard || (idCard.length !== 15 && idCard.length !== 18)) {
      return null;
    }
    let birthDateStr;
    let genderCode;
    if (idCard.length === 15) {
        birthDateStr = "19" + idCard.slice(6, 12);
        genderCode = parseInt(idCard.charAt(14), 10);
    } else {
        birthDateStr = idCard.slice(6, 14);
        genderCode = parseInt(idCard.charAt(16), 10);
    }
    const birthDate = dayjs(birthDateStr, 'YYYYMMDD');
    const today = dayjs();
    const age = today.diff(birthDate, 'year');
    const gender = genderCode % 2 === 0 ? '女' : '男';
    return { age, gender };
}

是不是相对来说,比较简单?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-01-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 锤子代码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档