java 数据类型相关的随机码 util工具类

1.CodeUtil.java

package com.jiayou.peis.common.core.util;

import cn.hutool.core.util.IdcardUtil;
import com.github.houbb.pinyin.constant.enums.PinyinStyleEnum;
import com.github.houbb.pinyin.util.PinyinHelper;
import com.jiayou.peis.common.core.constant.ConstNumber;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;

/**
 * <p>描述:您想说点什么?</p>
 *  数据类型相关的随机码
 * @author : wb
 * @date : 2021/1/15 17:14
 **/
@Slf4j
@UtilityClass
public class CodeUtil {
    final static DateTimeFormatter timeFormat = DateTimeFormatter.ofPattern("yyyyMMddHHmmSS");
    final static DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyyMMdd");
    final static SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");

    /**
     * 汉字转换为拼音(无声调无空格的拼音)
     * @param character  中文汉字
     * @return
     */
    public  String doPinyin(String character) {
        /**
         1、DEFAULT  默认模式,拼音声调在韵母第一个字母上。  pīn yīn
         2、NORMAL  普通模式,即不带声调。  pin yin
         3、NUM_LAST  数字标注模式,即拼音声调以数字形式在各个拼音之后,用数字 1-5 进行表示。  pin1 yin1
         4、FIRST_LETTER  首字母模式,只返回拼音的首字母部分。  p y
         */
        return PinyinHelper.toPinyin(character, PinyinStyleEnum.FIRST_LETTER,"");
    }
    /**
     * 获取订单号 = 日期格式:yyyyMMddHHmmSS + 长度随机码:len
     * @param len  长度随机码
     * @return
     */
    public  String getOrderCode(int len) {
        String orderCode = timeFormat.format(LocalDateTime.now());
        /**
         * 订单号生成规则 : 日期格式:yyyyMMddHHmmSS + 长度随机码:len
         */
        return orderCode + String.valueOf(Math.random()).substring(2, 2 + len);
    }
    /**
     * 获取个人体检号码(日期格式:yyyyMMdd + 长度随机码:len)
     * @param len  日期+随机码位数,2位,3位,4位。。。。。。
     * @return
     */
    public  String getDateCode(int len) {
        String cardCode = timeFormat.format(LocalDateTime.now());
        /**
         * 订单号生成规则 : 日期格式:yyyyMMddHHmmSS + 长度随机码:len
         */
        return cardCode + String.valueOf(Math.random()).substring(2, 2 + len);
    }

    /**
     * 身份证号码转换为年龄
     * @param idCard  身份证号码
     * @return
     */
    public String getIdCardAge(String idCard){
        return String.valueOf(IdcardUtil.getAgeByIdCard(idCard));
//        return getIdCardBirthDay(idCard,true);
    }

    /**
     * 身份证号码转化为 月份(不到一岁的,转为月)
     * @param idCard
     * @return
     */
    public String getIdCardMonth(String idCard){
            String idCardMonth = getCardBirthDay(idCard);
            SimpleDateFormat df=new SimpleDateFormat("MM");
            String ageMonthStr = df.format(new Date());
        return String.valueOf(Long.parseLong(ageMonthStr)-Long.parseLong(idCardMonth.substring(5,7)));
    }
    /**
     * 身份证号转换为年龄或者出生日期
     * @param idCard  身份证号
     * @param flag    true:转年龄;false:转出生日期
     * @return
     */
    private static String getIdCardBirthDay(String idCard,boolean flag) {
        String strStr= null;
        try {
            if (StringUtils.isEmpty(idCard) || idCard.length() != 15 && idCard.length() != 18) {
                log.error("身份证件号有误,无法计算年龄");
                return null;
            }
            if(flag){
                Calendar cal = Calendar.getInstance();
                int yearNow = cal.get(Calendar.YEAR);
                int monthNow = cal.get(Calendar.MONTH)+1;
                int dayNow = cal.get(Calendar.DATE);
                long millNow = format.parse(yearNow+""+(monthNow < 10 ? 0+""+monthNow :monthNow)+""+(dayNow < 10 ? 0+""+dayNow:dayNow)).getTime();
                long mill = format.parse(idCard.substring(6,14)).getTime(); //将出生日期转化为毫秒值
                //身份证转换为年龄
                long ag = (millNow - mill)/(1000*60*60)/(365*24);
                strStr = String.valueOf(ag);
            }else {
                //身份证截取出生日期
                strStr = idCard.substring(6,14);
                strStr = strStr.substring(0,4)+"-"+strStr.substring(4,6)+"-"+strStr.substring(6,8);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return strStr;
    }

    /**
     * 身份证号码转换为生日  yyyy-MM-dd
     *
     * @param idCard  身份证号码
     * @return
     */
    public String getCardBirthDay(String idCard){
        return getIdCardBirthDay(idCard,false);
    }

    /**
     * 身份证获取性别(1、男,0、女)
     * @param idCard
     * @return
     */
    public String getIdCardGender(String idCard){
        String gender = "";
        if (!StringUtils.isEmpty(idCard)){
            if(idCard.length()==18){
                gender = Integer.parseInt(idCard.substring(16, 17)) % 2 == 0 ? "0" : "1";
            }else if (idCard.length() == 15) {
                gender = Integer.parseInt(idCard.substring(idCard.length() - 3, idCard.length())) % 2 == 0 ? "0" : "1";
            }
        }
        return gender;
    }



    /**
     * 自定义随机码长度生成
     * @param len  随机码位数,2位,3位,4位。。。。。。
     * @return
     */
    public  String getRandomCode(int len) {
        char[] chars = new char[len];
        Random rnd = new Random();
        for (int i = 0; i < len; i++) {
            chars[i] = (char) ('0' + rnd.nextInt(10));
        }
        return new String(chars);
    }

    /**
     * 身份证转化为相关的数据(年龄,生日,性别)
     * @param identityCard
     * @return
     */
    public String[] autoIdCardArray(String identityCard) {
        if (StringUtils.isEmpty(identityCard)){
            return null;
        }
        String[] strArr = new String[4];
        String age = CodeUtil.getIdCardAge(identityCard) ;
        String ageUnit = ConstNumber.STRING_ONE;

        if (Integer.parseInt(age)==0){
            age = CodeUtil.getIdCardMonth(identityCard);
            ageUnit = ConstNumber.STRING_TWO;
        }
        //身份证号转换成年龄
        strArr[0] = age;
        strArr[1] = ageUnit;
        //身份证号转换成出生日期
        strArr[2] = CodeUtil.getCardBirthDay(identityCard);
        /**
         * 身份证获取性别(0、女;1、男)
         */
        strArr[3] = CodeUtil.getIdCardGender(identityCard);
        return  strArr;
    }

    /**
     * 将15位身份证号转化为18位返回,非15位身份证号原值返回
     * @param identityCard
     * @return
     */
    public  String get18Ic(String identityCard) {
        String retId = "";
        String id17 = "";
        int sum = 0;
        int y = 0;
        // 定义数组存放加权因子(weight factor)
        int[] wf = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
        // 定义数组存放校验码(check code)
        String[] cc = { "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" };
        if (identityCard.length() != 15) {
            return identityCard;
        }
        // 加上两位年19
        id17 = identityCard.substring(0, 6) + "19" + identityCard.substring(6);
        // 十七位数字本体码加权求和
        for (int i = 0; i < 17; i++) {
            sum = sum + Integer.valueOf(id17.substring(i, i + 1)) * wf[i];
        }
        // 计算模
        y = sum % 11;
        // 通过模得到对应的校验码 cc[y]
        retId = id17 + cc[y];
        return retId;
    }
    public static void main(String[] args) {
//        System.out.println("======orderCode======"+getOrderCode(3));
//        System.out.println("======cardCode======"+getDateCode(4));
//        System.out.println("======cardCode=========age===="+getIdCardAge("522626202102123213"));
//        System.out.println("======getIdCardBirthday======"+getCardBirthDay("522626199912193213"));
//        System.out.println("======0000000000=====age===="+getIdCardMonth("522626202102123213"));
//        System.out.println("======15位=====性别===="+getIdCardGender("330622810725323"));
//        System.out.println("======15位=====性别===="+getIdCardGender("511702800222130"));
//        System.out.println("======15位=====性别===="+getIdCardGender("511702198002221308"));

        String[] strings = CodeUtil.autoIdCardArray("522130197406100765");
        System.out.println(1);

        System.out.println(1);
        System.out.println(CodeUtil.doPinyin("组织与人力资源部(退休职工)"));

    }
}


2.引入相应maven

<dependencies>
       <!-- pinyin 是 java 实现的高性能中文拼音转换工具
              参考说明:https://blog.csdn.net/ryo1060732496/article/details/104034630
             -->
       <dependency>
           <groupId>com.github.houbb</groupId>
           <artifactId>pinyin</artifactId>
           <version>0.1.5</version>
       </dependency>
   </dependencies>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值