根据以下已知条件写出计算请假天数的最优算法 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 21:08:14 浏览: 103
好的,根据您提供的条件,我可以为您编写一个请假天数计算的算法。以下是Java代码:
```
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
public class LeaveDaysCalculator {
// 工作时间段上午开始时间
private static LocalTime AM_START_TIME = LocalTime.of(8, 30);
// 工作时间段上午结束时间
private static LocalTime AM_END_TIME = LocalTime.of(12, 30);
// 工作时间段下午开始时间
private static LocalTime PM_START_TIME = LocalTime.of(13, 30);
// 工作时间段下午结束时间
private static LocalTime PM_END_TIME = LocalTime.of(17, 30);
// 日期格式化字符串
private static String DATE_PATTERN = "yyyy-MM-ddHH:mm:ss";
/**
* 计算请假天数
*
* @param startTime 开始时间字符串,格式为"yyyy-MM-ddHH:mm:ss"
* @param endTime 结束时间字符串,格式为"yyyy-MM-ddHH:mm:ss"
* @return 请假天数
*/
public static int calculateLeaveDays(String startTime, String endTime) {
LocalDateTime startDateTime = LocalDateTime.parse(startTime, DateTimeFormatter.ofPattern(DATE_PATTERN));
LocalDateTime endDateTime = LocalDateTime.parse(endTime, DateTimeFormatter.ofPattern(DATE_PATTERN));
LocalDate startDate = startDateTime.toLocalDate();
LocalDate endDate = endDateTime.toLocalDate();
int leaveDays = 0;
while (startDate.isBefore(endDate) || startDate.isEqual(endDate)) {
if (isWorkday(startDate)) {
if (startDate.isEqual(endDate)) {
leaveDays += calculateWorkHours(startDateTime.toLocalTime(), endDateTime.toLocalTime()) / 8;
} else {
leaveDays++;
}
}
startDate = startDate.plusDays(1);
}
return leaveDays;
}
/**
* 判断指定日期是否是工作日(周一至周五)
*
* @param date 日期
* @return true表示是工作日,false表示不是工作日
*/
private static boolean isWorkday(LocalDate date) {
// 周六、周日为非工作日
if (date.getDayOfWeek() == DayOfWeek.SATURDAY || date.getDayOfWeek() == DayOfWeek.SUNDAY) {
return false;
}
// 法定节假日为非工作日
// TODO 如果需要支持法定节假日,请在此处添加相应代码
return true;
}
/**
* 计算指定时间段内的工作小时数
*
* @param startTime 开始时间
* @param endTime 结束时间
* @return 工作小时数,单位为分钟
*/
private static int calculateWorkHours(LocalTime startTime, LocalTime endTime) {
int workMinutes = 0;
if (startTime.isBefore(AM_START_TIME)) {
workMinutes += ChronoUnit.MINUTES.between(AM_START_TIME, AM_END_TIME);
} else if (startTime.isBefore(AM_END_TIME)) {
workMinutes += ChronoUnit.MINUTES.between(startTime, AM_END_TIME);
}
if (endTime.isAfter(PM_END_TIME)) {
workMinutes += ChronoUnit.MINUTES.between(PM_START_TIME, PM_END_TIME);
} else if (endTime.isAfter(PM_START_TIME)) {
workMinutes += ChronoUnit.MINUTES.between(PM_START_TIME, endTime);
}
return workMinutes / 60;
}
}
```
您可以使用以下代码调用该方法:
```
String startTime = "2022-09-3013:30:00";
String endTime = "2022-10-1517:30:00";
int leaveDays = LeaveDaysCalculator.calculateLeaveDays(startTime, endTime);
System.out.println("请假天数:" + leaveDays);
```
注意,这段代码并没有考虑法定节假日的情况,如果您需要支持法定节假日的计算,请在 `isWorkday` 方法中添加相应代码。
阅读全文