根据以下已知条件写出计算请假天数的最优算法 1、年度日历数据表结构如下,可直接获取日期类型 1:工作日 2:法定假日 3:周末假日 2、每日工作时间设定数据如下 上午上班时间:08:30 上午下班时间:12:30 下午上班:13:30 下午下班时间:17:30 3、问题:根据输入的开始结束时间,计算请假天数 例阳:2022-09-3013:30:00至2022-10-1517:30:00 用java实现
时间: 2023-06-04 09:07:44 浏览: 152
renshi.rar_java 人事_java 请假_人事管理_人事管理系统_请假
抱歉,我可以回答此问题。
根据已知条件,可以编写一个算法来计算请假天数。具体步骤如下:
1. 将开始时间和结束时间转换为日期对象,方便计算。
2. 从开始日期开始遍历到结束日期,每遍历一天,判断这一天是否为工作日,是则计入请假天数。
3. 对于每个工作日,还需要判断是否在规定的上午上班时间和下午下班时间之间,请假时间在此范围内的才算一段完整工作时间。如果请假时间不在此范围内,则按部分工作时间计算。
4. 最后计算出请假的天数即可。
以下是使用Java实现上述算法的示例代码:
```java
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class LeaveCalculator {
private static final int WORKDAY = 1;
private static final int HOLIDAY = 2;
private static final int WEEKEND = 3;
private static final LocalTime morningStart = LocalTime.of(8, 30);
private static final LocalTime morningEnd = LocalTime.of(12, 30);
private static final LocalTime afternoonStart = LocalTime.of(13, 30);
private static final LocalTime afternoonEnd = LocalTime.of(17, 30);
public static int calculateLeaveDays(LocalDateTime start, LocalDateTime end) {
int days = 0;
LocalDate date = start.toLocalDate();
while (!date.isAfter(end.toLocalDate())) {
int type = getDayType(date);
if (type == WORKDAY) {
if (isFullWorkTime(start, end, date)) {
days++;
} else if (isPartWorkTime(start, end, date)) {
days += 0.5;
}
}
date = date.plusDays(1);
}
return days;
}
private static int getDayType(LocalDate date) {
// 根据日历表获取日期类型
return WORKDAY;
}
private static boolean isFullWorkTime(LocalDateTime start, LocalDateTime end, LocalDate date) {
if (date.isEqual(start.toLocalDate())) {
return start.toLocalTime().isAfter(morningStart) && start.toLocalTime().isBefore(afternoonEnd);
} else if (date.isEqual(end.toLocalDate())) {
return end.toLocalTime().isAfter(morningStart) && end.toLocalTime().isBefore(afternoonEnd);
} else {
return true;
}
}
private static boolean isPartWorkTime(LocalDateTime start, LocalDateTime end, LocalDate date) {
if (date.isEqual(start.toLocalDate())) {
return !start.toLocalTime().isBefore(morningEnd) && end.toLocalTime().isAfter(afternoonStart);
} else if (date.isEqual(end.toLocalDate())) {
return !end.toLocalTime().isAfter(afternoonStart) && start.toLocalTime().isBefore(morningEnd);
} else {
return false;
}
}
}
```
调用示例:
```java
LocalDateTime start = LocalDateTime.of(2022, 9, 30, 13, 30);
LocalDateTime end = LocalDateTime.of(2022, 10, 15, 17, 30);
int leaveDays = LeaveCalculator.calculateLeaveDays(start, end);
System.out.println("请假天数:" + leaveDays);
```
阅读全文