订单号生成:
- 毫秒仅保留三位(缩减长度同时保证应用切换不存在重复的可能)
- 使用线程安全的计数器做数字递增(三位数最低保证并发800不重复,代码中我给了4位)
- 更换日期转换为java8的日期类以格式化(线程安全及代码简洁性考量)
private static final AtomicInteger SEQ = new AtomicInteger(1000); private static final DateTimeFormatter DF_FMT_PREFIX = DateTimeFormatter.ofPattern("yyMMddHHmmssSS"); private static ZoneId ZONE_ID = ZoneId.of("Asia/Shanghai"); public static String generateOrderNo(){ LocalDateTime dataTime = LocalDateTime.now(ZONE_ID); if(SEQ.intValue()>9990){ SEQ.getAndSet(1000); } return dataTime.format(DF_FMT_PREFIX)+SEQ.getAndIncrement(); }