JAVA工具类(一)——生成班次排班记录

根据输入的时间以及日期间隔,输出每天的排班记录

假如你有这样一个需求:

  • 有一个排班信息,比如:白班(08:00:00 - 20:00:00),夜班(20:00:00 - 08:00:00)
  • 我想获取到某个日期范围内的排班信息
  • 那么就可以用这个工具类来实现

新建两个实体

  • ShiftType
1
2
3
4
5
6
7
8
9
10
11
12
13
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ShiftType {
private LocalTime start;
private LocalTime end;
private String shiftName;

@Override
public String toString() {
return shiftName + ":" + start.toString() + " - " + end.toString();
}
}
  • Shift
1
2
3
4
5
6
7
8
9
10
11
12
13
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Shift {
private LocalDateTime start;
private LocalDateTime end;
private String shiftName;

@Override
public String toString() {
return shiftName + ":" + start.toString() + " - " + end.toString();
}
}

工具类实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* 生成排班记录
*
* @param startDate 开始日期
* @param endDate 结束日期
* @param shiftTypes 班次记录
*/
public static List<Shift> generateShifts(LocalDate startDate, LocalDate endDate, List<ShiftType> shiftTypes) {
List<Shift> shifts = new ArrayList<>();

// 从开始日期到结束日期遍历
LocalDate currentDate = startDate;
while (currentDate.isBefore(endDate) || currentDate.isEqual(endDate)) {
for (ShiftType shiftType : shiftTypes) {
LocalDateTime shiftStart = LocalDateTime.of(currentDate, shiftType.getStart());
LocalDateTime shiftEnd = shiftType.getEnd().isBefore(shiftType.getStart()) ?
LocalDateTime.of(currentDate.plusDays(1), shiftType.getEnd()) :
LocalDateTime.of(currentDate, shiftType.getEnd());

shifts.add(new Shift(shiftStart, shiftEnd, shiftType.getShiftName()));
}
currentDate = currentDate.plusDays(1);
}
//排序
shifts.sort(Comparator.comparing(Shift::getStart));
return shifts;
}

测试

1
2
3
4
5
6
7
8
9
10
public static void main(String[] args) {
ArrayList<ShiftType> shiftTypes = new ArrayList<>();

shiftTypes.add(new ShiftType(LocalTime.parse("00:00:00"), LocalTime.parse("08:00:00"), "班次1"));
shiftTypes.add(new ShiftType(LocalTime.parse("16:00:00"), LocalTime.parse("00:00:00"), "班次3"));
shiftTypes.add(new ShiftType(LocalTime.parse("08:00:00"), LocalTime.parse("16:00:00"), "班次2"));

List<Shift> shifts = ShiftDateUtils.generateShifts(LocalDate.parse("2024-08-01"), LocalDate.parse("2024-08-03"), shiftTypes);
System.out.println(shifts);
}

测试结果

1
2
3
4
5
6
7
8
9
[班次1:2024-08-01T00:00 - 2024-08-01T08:00, 
班次2:2024-08-01T08:00 - 2024-08-01T16:00,
班次3:2024-08-01T16:00 - 2024-08-02T00:00,
班次1:2024-08-02T00:00 - 2024-08-02T08:00,
班次2:2024-08-02T08:00 - 2024-08-02T16:00,
班次3:2024-08-02T16:00 - 2024-08-03T00:00,
班次1:2024-08-03T00:00 - 2024-08-03T08:00,
班次2:2024-08-03T08:00 - 2024-08-03T16:00,
班次3:2024-08-03T16:00 - 2024-08-04T00:00]