生成唯一有序的长序号方法(编码中含有日期的)-Java

该方法生成的长序号一共有两种-根据需要选择

第一种:开头不含四位随机码的(有限的唯一序号),每天最多生成25974条唯一长序号,当天如果超了就会出现重复,示例如下

# 不带随机码生成的示例
LOGA20240223001

第二种:开头含四位随机码的(无限的唯一序号),每天生成的编码超过25974条唯一长序号时会把开头的四位随机码进行更换,示例如下

# 带随机码生成的示例
0168LOGA20240223001

生成原理就是-标识符+字母+序号

# LOG为标识
LOGA20240223001

# A为字母,最后3位要超过999时,A就会变成B,以此类推
LOGA20240223999 -----> LOGB20240223001

# 中间的是当天日期-当到了明天字母和序号都会变回第一
LOGB20240223168 -----> LOGA20240224001

# 最后3位就是序号0-999,当超过999时变为001
LOGA20240223999 -----> LOGB20240223001

完整代码如下

/**
 * 生成编码
 *
 * @param sign 自定义标识 (可以为空)
 * @param lastNumber 上一个编码 (没有则生成新的)
 * @param isRandom 是否在开头添加随机数
 * @return 生成的编码
 */
public static String generateNumber(String sign, String lastNumber, boolean isRandom) {
    sign = StringUtils.hasLength(sign) ? sign : "";
    StringBuilder sb = new StringBuilder();
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
    Date nowDate = new Date();
    try {
        if (StringUtils.hasLength(lastNumber)) {
            String random = isRandom ? lastNumber.substring(0, 4) : "";
            lastNumber = isRandom ? lastNumber.substring(4) : lastNumber;
            int signLength = sign.length();
            int num = Integer.parseInt(lastNumber.substring(signLength + 9));
            String frequency = lastNumber.substring(signLength, signLength + 1);
            Date oldDate = dateFormat.parse(lastNumber.substring(signLength + 1, signLength + 9));
            if (dateFormat.parse(dateFormat.format(nowDate)).equals(oldDate)) {
                if (num == 999) {
                    num = 1;
                    if ("Z".equals(frequency)) {
                        frequency = "A";
                        random = isRandom ? String.format("%04d", new Random().nextInt(9999)) : "";
                    } else {
                        frequency = String.valueOf(++frequency.toCharArray()[0]);
                    }
                } else {
                    ++num;
                }
            } else {
                num = 1;
                frequency = "A";
            }
            sb.append(random).append(sign).append(frequency).append(dateFormat.format(nowDate)).append(String.format("%03d", num));
        } else {
            sb.append(isRandom ? String.format("%04d", new Random().nextInt(9999)) : "").append(sign).append("A").append(dateFormat.format(nowDate)).append("001");
        }
    } catch (Exception e) {
        e.printStackTrace();
        System.err.println("--------生成编号失败--------");
    }
    return sb.toString();
}
  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值