在Java中生成包含日期和流水号的订单号,可以按照以下步骤实现:
yyyyMMddHHmmss 的字符串以下是完整实现代码:
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.atomic.AtomicInteger;
public class OrderNumberGenerator {
// 格式化日期的模式
private static final String DATE_FORMAT_PATTERN = "yyyyMMddHHmmss";
// 流水号的初始值
private static final int INITIAL_SEQUENCE = 0;
// 流水号的最大数值
private static final int MAX_SEQUENCE = 9999;
// 流水号的固定位数
private static final int SEQUENCE_DIGITS = 4;
// 用于生成日期格式的线程安全的SimpleDateFormat
private static final ThreadLocal<SimpleDateFormat> DATE_FORMAT_THREAD_LOCAL =
ThreadLocal.withInitial(() -> new SimpleDateFormat(DATE_FORMAT_PATTERN));
// 原子计数器,用于生成流水号,确保线程安全
private static final AtomicInteger sequence = new AtomicInteger(INITIAL_SEQUENCE);
/**
* 生成下一个订单号
* @return 格式为"日期+流水号"的订单号,如202507281234560001
*/
public static synchronized String nextOrderNumber() {
// 获取当前日期字符串
String datePart = formatCurrentDate();
// 获取流水号并递增
int currentSequence = sequence.getAndIncrement();
// 当流水号达到最大值时,重置为初始值
if (currentSequence >= MAX_SEQUENCE) {
sequence.set(INITIAL_SEQUENCE);
currentSequence = INITIAL_SEQUENCE;
}
// 格式化流水号,不足位数时前补零
String sequencePart = String.format("%0" + SEQUENCE_DIGITS + "d", currentSequence);
// 组合日期和流水号部分
return datePart + sequencePart;
}
/**
* 格式化当前日期为字符串
* @return 格式化后的日期字符串
*/
private static String formatCurrentDate() {
return DATE_FORMAT_THREAD_LOCAL.get().format(new Date());
}
// 示例使用
public static void main(String[] args) {
// 生成10个测试订单号
for (int i = 0; i < 10; i++) {
System.out.println("生成的订单号: " + nextOrderNumber());
try {
// 模拟处理延迟
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}AtomicInteger 确保多线程环境下流水号的唯一性ThreadLocal<SimpleDateFormat> 避免日期格式化时的线程安全问题synchronized 方法保证高并发下日期和流水号的一致性String.format("%04d", number) 确保流水号始终为4位DATE_FORMAT_PATTERN 调整SEQUENCE_DIGITS 和 MAX_SEQUENCE 扩展运行上述代码的 main 方法,会输出类似以下格式的订单号:
生成的订单号: 202507281234560000
生成的订单号: 202507281234560001
生成的订单号: 202507281234560002
这个实现方案能够在单机环境下高效生成唯一订单号,适用于大多数业务系统。如需分布式环境下的唯一性,可考虑结合UUID或分布式ID生成器(如Snowflake算法)。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。