java 数据类型相关的随机码 util工具类
2023-12-14 06:53:13
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>
文章来源:https://blog.csdn.net/qq_30272167/article/details/134874595
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!