计时种类 2.1 普通计时 包括,工作日,工作时,为普通计时,这种计时方式按照打卡时间来计时,计时过程中要排除掉非工作日(工作时) 示例: 前提:上班时间为:上午 09-11:30 下午12:30-17:30 夜间 18:30-23:30 普通计时 案件2023-05-18 08:30:55 上报,那么计时就从 2023-05-18 09:00:00开始计时 案件2023-05-18 09:30:55 上报,那么计时就从 2023-05-18 09:30:55开始计时 也就是不在工作时或者工作日的时间,要排除掉 2.2 紧急计时 紧急计时,就是不排除掉非工作日(时),案件从上报开始就开始计时 前提:上班时间为:上午 09-11:30 下午12:30-17:30 夜间 18:30-23:30 示例: 案件2023-05-18 08:30:55 上报,那么计时就从 2023-05-18 08:30:55 开始计时 。用java代码实现上述逻辑,并提供完整demo
时间: 2023-07-16 13:13:59 浏览: 92
以下是一个简单的 Java 实现示例,其中包括了普通计时和紧急计时两种计时方式的逻辑:
```java
import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class CaseTimer {
private final LocalTime morningStart = LocalTime.of(9, 0);
private final LocalTime morningEnd = LocalTime.of(11, 30);
private final LocalTime afternoonStart = LocalTime.of(12, 30);
private final LocalTime afternoonEnd = LocalTime.of(17, 30);
private final LocalTime nightStart = LocalTime.of(18, 30);
private final LocalTime nightEnd = LocalTime.of(23, 30);
public LocalDateTime startTiming(boolean isEmergency, LocalDateTime reportTime) {
if (isEmergency) {
// 紧急计时,从上报时间开始计时
return reportTime;
} else {
// 普通计时,从下一个工作时间开始计时
LocalDateTime nextWorkTime = getNextWorkTime(reportTime);
return nextWorkTime != null ? nextWorkTime : reportTime;
}
}
private LocalDateTime getNextWorkTime(LocalDateTime time) {
DayOfWeek dayOfWeek = time.getDayOfWeek();
LocalTime localTime = time.toLocalTime();
if (dayOfWeek == DayOfWeek.SATURDAY || dayOfWeek == DayOfWeek.SUNDAY) {
// 非工作日
return null;
} else if (localTime.isBefore(morningStart)) {
// 上午未开始上班
return LocalDateTime.of(time.toLocalDate(), morningStart);
} else if (localTime.isAfter(nightEnd)) {
// 当天晚上及以后
return null;
} else if (localTime.isAfter(afternoonEnd) && localTime.isBefore(nightStart)) {
// 下午下班后,晚上上班前
return LocalDateTime.of(time.toLocalDate().plusDays(1), morningStart);
} else if (localTime.isAfter(morningEnd) && localTime.isBefore(afternoonStart)) {
// 中午休息时间
return LocalDateTime.of(time.toLocalDate(), afternoonStart);
} else if (localTime.isAfter(morningStart) && localTime.isBefore(morningEnd)) {
// 上午上班时间
return LocalDateTime.of(time.toLocalDate(), morningEnd);
} else if (localTime.isAfter(afternoonStart) && localTime.isBefore(afternoonEnd)) {
// 下午上班时间
return LocalDateTime.of(time.toLocalDate(), afternoonEnd);
} else {
// 其他情况,如晚上上班时间
return LocalDateTime.of(time.toLocalDate(), localTime);
}
}
}
```
这里用到了 Java 8 中的 `LocalDateTime` 和 `LocalTime` 类,通过判断当前时间所在的星期几和时间段,来确定下一个工作时间。其中 `startTiming` 方法接收两个参数,第一个是计时类型,第二个是上报时间。如果是紧急计时,直接返回上报时间,否则调用 `getNextWorkTime` 方法获取下一个工作时间,如果获取到就从那个时间开始计时,否则就从上报时间开始计时。
阅读全文