Java开发工具类--根据日期生成流水号

1,031 阅读1分钟

一、使用背景

在日常开发过程中,尤其订单和支付过程中,难免用到订单流水号,为类节省开发,在这里和大家分享工具类,希望给大家带来帮助。

二、直接上代码

package com.train.common.utils;
import cn.hutool.core.date.DatePattern;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.text.SimpleDateFormat;
import java.util.Date;


/**
 * </p>
 * 流水号生成工具类
 * </p>
 *
 */

public class SerialUtil {
    private static final Logger logger = LoggerFactory.getLogger(SerialUtil.class);
    // 使用单例模式,不允许直接创建实例
    private SerialUtil() {
    }

    // 全局自增数
    private static int count = 0;
    // 每毫秒秒最多生成多少订单(最好是像9999这种准备进位的值)
    private static final int total = 9999;
    // 格式化的时间字符串
    private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DatePattern.PURE_DATETIME_MS_PATTERN);

    // 获取当前时间年月日时分秒毫秒字符串
    private static String getNowDateStr() {
        return simpleDateFormat.format(new Date());
    }

    // 记录上一次的时间,用来判断是否需要递增全局数

    private static String now = null;

    /*
     * 生成一个订单号 - 支付平台使用
     */

    public static synchronized String generateOrder() {
        String datasets = getNowDateStr();
        if (datasets.equals(now)) {
            count++;// 自增
        } else {
            count = 1;
            now = datasets;
        }
        int countInteger = String.valueOf(total).length() - String.valueOf(count).length();

        // 算补位
        StringBuilder bu = new StringBuilder();
        // 补字符串
        for (int i = 0; i < countInteger; i++) {
            bu.append("0");
        }
        bu.append(count);
        if (count >= total) {
            count = 0;
        }
        return datasets + bu;
    }

    public static void main(String[] args) {
        String serialNumber = generateOrder();
        logger.info("生成的订单号为:{}", serialNumber);
    }
}