Java 生成订单号

现在开始好好写自己的代码。

生成订单号是很常用的一个功能,要求生成唯一不重复的值,作为订单唯一标识。方法有很多,有写是直接根据数据库自增ID作为订单号,也有使用GUID作为订单号的等等。。。
其实各有优点,具体根据自己的业务需求来定义了。而我这个主要是使用时间,生成年月日加自增数,每毫秒最多可以生成9999个订单,当然这个是可以配置的,根据现实业务情况进行定义。下面来看代码:

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 生成订单号类
 */
public class GenerateNum {
    // 使用单例模式,不允许直接创建实例
    private GenerateNum() {}

    // 创建一个空实例对象,类需要用的时候才赋值
    private static GenerateNum g = null;

    // 单例模式--懒汉模式
    public static synchronized GenerateNum getInstance() {
        if (g == null) {
            g = new GenerateNum();
        }
        return g;
    }

    // 全局自增数
    private static int count = 0;

    // 每毫秒秒最多生成多少订单(最好是像9999这种准备进位的值)
    private static final int total = 9999;

    // 格式化的时间字符串
    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");

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

    // 记录上一次的时间,用来判断是否需要递增全局数
    private static String now = null;

    /*
     * 生成一个订单号
     */
    public synchronized String GenerateOrder() {
        String datastr = getNowDateStr();
        if (datastr.equals(now)) {
            count++;// 自增
        } else {
            count = 1;
            now = datastr;
        }
        int countInteger = String.valueOf(total).length() - String.valueOf(count).length();// 算补位
        String bu = "";// 补字符串
        for (int i = 0; i < countInteger; i++) {
            bu += "0";
        }
        bu += String.valueOf(count);
        if (count >= total) {
            count = 0;
        }
        return datastr + bu;
    }
}

这里用了单例懒汉模式。调用的时候:

GenerateNum.getInstance().GenerateOrder();

测试输出如下:

201612081010145410001
201612081010145410002
201612081010145410003
201612081010145410004
201612081010145410005
201612081010145410006
201612081010145410007
201612081010145410008
201612081010145420001
201612081010145420002
201612081010145420003
201612081010145420004
201612081010145420005
201612081010145420006
201612081010145420007
201612081010145420008
201612081010145420009
201612081010145420010
201612081010145420011
201612081010145420012
201612081010145420013
201612081010145420014
201612081010145420015
201612081010145420016
201612081010145420017
201612081010145420018
201612081010145420019
201612081010145420020
201612081010145420021
201612081010145420022
201612081010145420023
201612081010145420024
201612081010145420025
201612081010145420026
201612081010145420027
201612081010145420028
201612081010145420029
201612081010145420030
201612081010145420031
201612081010145420032
201612081010145420033
201612081010145420034
201612081010145420035
201612081010145420036
201612081010145420037
201612081010145420038
201612081010145420039
201612081010145420040
201612081010145420041
201612081010145420042
201612081010145420043
201612081010145420044
201612081010145420045
201612081010145440001
201612081010145440002
201612081010145440003
201612081010145440004
201612081010145450001
201612081010145450002
201612081010145450003
201612081010145450004
201612081010145450005
201612081010145450006
201612081010145450007
201612081010145450008
201612081010145450009
201612081010145450010
201612081010145450011
201612081010145450012
201612081010145450013
201612081010145450014
201612081010145450015
201612081010145450016
201612081010145450017
201612081010145450018
201612081010145450019
201612081010145450020
201612081010145450021
201612081010145450022
201612081010145450023
201612081010145450024
201612081010145450025
201612081010145450026
201612081010145450027
201612081010145450028
201612081010145450029
201612081010145450030
201612081010145450031
201612081010145450032
201612081010145450033
201612081010145450034
201612081010145450035
201612081010145450036
201612081010145450037
201612081010145450038
201612081010145450039
201612081010145450040
201612081010145450041
201612081010145450042
201612081010145450043
201612081010145450044
201612081010145450045
201612081010145450046
201612081010145450047
201612081010145450048
Java生成订单号(日期+流水号),可以使用SimpleDateFormat类和AtomicInteger类来实现。 1. 获取当前日期,可以使用SimpleDateFormat类将当前时间格式化为指定的日期格式,比如"yyyyMMdd"。 ```java SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); String currentDate = dateFormat.format(new Date()); ``` 2. 生成流水号,可以使用AtomicInteger类来维护一个自增的流水号。每次生成订单号时,调用incrementAndGet()方法获取下一个流水号。 ```java AtomicInteger sequence = new AtomicInteger(0); int nextSequence = sequence.incrementAndGet(); ``` 3. 将日期和流水号拼接生成订单号。 ```java String orderNumber = currentDate + String.format("%04d", nextSequence); ``` 这里使用了String类的format()方法来保证流水号的位数,比如如果流水号是1,则格式化为"0001",如果流水号是12,则格式化为"0012"。 完整的代码如下: ```java import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.atomic.AtomicInteger; public class OrderNumberGenerator { private static AtomicInteger sequence = new AtomicInteger(0); public static String generateOrderNumber() { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); String currentDate = dateFormat.format(new Date()); int nextSequence = sequence.incrementAndGet(); String orderNumber = currentDate + String.format("%04d", nextSequence); return orderNumber; } public static void main(String[] args) { String orderNumber = generateOrderNumber(); System.out.println(orderNumber); } } ``` 每次调用generateOrderNumber()方法可以生成一个新的订单号,格式为"yyyyMMdd0001"、"yyyyMMdd0002"等。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值