场景
Java实体中时间属性用Date和LocalDateTime的区别、格式化示例、灵活时间解析器构建示例:
https://blog.youkuaiyun.com/BADAO_LIUMANG_QIZHI/article/details/151789444
下面记录使用LocalDateTime实现当日内班次名称累计序号生成的简单示例。
如果当天没有业务数据,则生成诸如“2025/11/05-1”的编号数据。
如果当前已经有1条数据,则生成"2025/11/05-2"的编号。
以此类推。
在不考虑大数量以及并发、加锁等特殊操作情况下,只做简单的编号生成。
注:
博客:
https://blog.youkuaiyun.com/badao_liumang_qizhi
实现
1、首先查询当天内符合条件的数据
List<ShiftFinishManagement> list = this.lambdaQuery()
.ge(ShiftFinishManagement::getShiftStartTime,
shiftFinishDTO.getShiftEndTime().truncatedTo(ChronoUnit.DAYS))
.lt(ShiftFinishManagement::getShiftStartTime,
shiftFinishDTO.getShiftEndTime().truncatedTo(ChronoUnit.DAYS).plusDays(1))
.eq(ShiftFinishManagement::getStoreId, shiftFinishDTO.getStoreId())
.orderByAsc(ShiftFinishManagement::getShiftStartTime)
.list();
2、传递查询结果调用生成编号的方法
String generateShiftName = generateShiftName(shiftFinishDTO, list);
方法实现
private String generateShiftName(ShiftFinishDTO shiftFinishDTO,List<ShiftFinishManagement> dailyShifts){
// 1. 获取基准日期(当日00:00)
LocalDate baseDate = shiftFinishDTO.getShiftEndTime().toLocalDate();
int sequence = dailyShifts.size()+1;
return baseDate.format(DATE_FORMATTER) + "-" + sequence;
}
这里格式化使用常量声明
private static final DateTimeFormatter DATE_FORMATTER =
DateTimeFormatter.ofPattern("yyyy/MM/dd");
其中toLocalDate用来获取日期字段,然后调用format方法进行格式化数据。
序号通过已存在的数据的序号加1实现。
3、如果是生成当天第一条数据,需要修改如下
private String generateFirstShiftName(){
// 1. 获取基准日期(当日00:00)
LocalDate baseDate = LocalDateTime.now().toLocalDate();
int sequence = 1;
return baseDate.format(DATE_FORMATTER) + "-" + sequence;
}
或者结合上面的方法进行判断和兼容语法,修改成同一个方法。
private String generateShiftName(ShiftFinishDTO shiftFinishDTO, List<ShiftFinishManagement> dailyShifts) {
// 获取基准日期
LocalDate baseDate = (shiftFinishDTO != null)
? shiftFinishDTO.getShiftEndTime().toLocalDate()
: LocalDateTime.now().toLocalDate();
// 确定序号
int sequence = (dailyShifts != null)
? dailyShifts.size() + 1
: 1;
return baseDate.format(DATE_FORMATTER) + "-" + sequence;
}

被折叠的 条评论
为什么被折叠?



