根据以下已知条件写出计算请假天数的最优算法 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 14:07:36 浏览: 264
好的,根据您的要求,我会进行回答。根据您提供的已知条件,可以编写以下的请假天数计算算法:
// 请假天数计算算法
public int calcLeaveDays(Date startDate, Date endDate) {
int leaveDays = 0;
Calendar startCal = Calendar.getInstance();
startCal.setTime(startDate);
Calendar endCal = Calendar.getInstance();
endCal.setTime(endDate);
while (startCal.getTime().before(endCal.getTime()) || startCal.getTime().equals(endCal.getTime())) {
int dayOfWeek = startCal.get(Calendar.DAY_OF_WEEK);
if (dayOfWeek != Calendar.SATURDAY && dayOfWeek != Calendar.SUNDAY) {
// 判断是否为工作日
int dayType = getDayType(startCal.getTime());
if (dayType == 1) {
// 工作日
Date amStart = getAMStartTime(startCal.getTime());
Date amEnd = getAMEndTime(startCal.getTime());
Date pmStart = getPMStartTime(startCal.getTime());
Date pmEnd = getPMEendTime(startCal.getTime());
if (startDate.before(amStart)) {
// 开始时间早于上午上班时间
startDate = amStart;
}
if (endDate.after(pmEnd)) {
// 结束时间晚于下午下班时间
endDate = pmEnd;
}
long startMillis = startDate.getTime();
long endMillis = endDate.getTime();
leaveDays += ((endMillis - startMillis) / (1000 * 60 * 60 * 24) + 1);
} else if (dayType == 2) {
// 法定假日
leaveDays++;
} else if (dayType == 3) {
// 周末假日
// do nothing
}
}
startCal.add(Calendar.DAY_OF_MONTH, 1);
}
return leaveDays;
}
// 获取日期类型,1:工作日 2:法定假日 3:周末假日
private int getDayType(Date date) {
// 根据年度日历数据表结构获取日期类型,此处省略
// 可以将年度日历数据存储在数据库中,并根据日期查询数据获取日期类型
// 此处假设已经能够正确获取日期类型,并直接返回
return 1;
}
// 获取上午上班时间
private Date getAMStartTime(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 8);
cal.set(Calendar.MINUTE, 30);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
}
// 获取上午下班时间
private Date getAMEndTime(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 12);
cal.set(Calendar.MINUTE, 30);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
}
// 获取下午上班时间
private Date getPMStartTime(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 13);
cal.set(Calendar.MINUTE, 30);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
}
// 获取下午下班时间
private Date getPMEendTime(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 17);
cal.set(Calendar.MINUTE, 30);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
}
这是一段简单的 Java 代码,可以根据输入的开始时间和结束时间,计算请假天数。计算方式是根据年度日历数据表中每个日期的类型(工作日、法定假日、周末假日),并结合每日工作时间设定数据,计算出请假天数。
阅读全文