JAVA 计算指定工作日工作了多少分钟 单位(分钟) 1.传入工作时段字符串,格式为String(HH:mm-HH:mm;HH:mm-HH:mm;HH:mm-HH:mm), 2.传入工作开始日期时间(Date类型yyyy-MM-dd hh:mm:ss) 3.传入工作结束日期时间(Date类型yyyy-MM-dd hh:mm:ss) 4.传入一个指定年月日(Date类型yyyy-MM-dd),该日期已知在工作开始和结束日期之间
时间: 2024-02-05 21:10:35 浏览: 131
工作日计算的JAVA实现
5星 · 资源好评率100%
以下是实现计算指定工作日工作了多少分钟的 Java 代码:
```java
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class WorkTimeCalculator {
private static final int WORK_MINUTES_PER_DAY = 8 * 60; // 每天工作分钟数
/**
* 计算指定工作日工作了多少分钟
* @param workTimeStr 工作时段字符串,格式为 "HH:mm-HH:mm;HH:mm-HH:mm;HH:mm-HH:mm"
* @param startDate 工作开始日期时间
* @param endDate 工作结束日期时间
* @param specifiedDate 指定年月日
* @return 工作分钟数
* @throws ParseException
*/
public static int calculateWorkMinutes(String workTimeStr, Date startDate, Date endDate, Date specifiedDate) throws ParseException {
Calendar startCal = Calendar.getInstance();
startCal.setTime(startDate);
Calendar endCal = Calendar.getInstance();
endCal.setTime(endDate);
Calendar specCal = Calendar.getInstance();
specCal.setTime(specifiedDate);
int workMinutes = 0;
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
String[] workTimeArr = workTimeStr.split(";");
for (Calendar cal = startCal; cal.before(endCal); cal.add(Calendar.DATE, 1)) {
if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
// 周末不计算工作时间
continue;
}
if (cal.get(Calendar.YEAR) == specCal.get(Calendar.YEAR) && cal.get(Calendar.MONTH) == specCal.get(Calendar.MONTH) && cal.get(Calendar.DATE) == specCal.get(Calendar.DATE)) {
// 指定日期当天的工作时间
for (String workTime : workTimeArr) {
String[] timeArr = workTime.split("-");
Date startWorkTime = sdf.parse(timeArr[0]);
Date endWorkTime = sdf.parse(timeArr[1]);
Calendar startWorkCal = Calendar.getInstance();
startWorkCal.setTime(startWorkTime);
Calendar endWorkCal = Calendar.getInstance();
endWorkCal.setTime(endWorkTime);
if (cal.get(Calendar.HOUR_OF_DAY) < startWorkCal.get(Calendar.HOUR_OF_DAY)) {
// 当天工作开始时间在指定工作时段之前
workMinutes += (endWorkCal.get(Calendar.HOUR_OF_DAY) - startWorkCal.get(Calendar.HOUR_OF_DAY)) * 60;
workMinutes += endWorkCal.get(Calendar.MINUTE) - startWorkCal.get(Calendar.MINUTE);
} else if (cal.get(Calendar.HOUR_OF_DAY) > endWorkCal.get(Calendar.HOUR_OF_DAY)) {
// 当天工作开始时间在指定工作时段之后
continue;
} else {
// 当天工作开始时间在指定工作时段内
if (cal.get(Calendar.MINUTE) < startWorkCal.get(Calendar.MINUTE)) {
// 当天工作开始时间在指定工作时段之前
workMinutes += endWorkCal.get(Calendar.MINUTE) - startWorkCal.get(Calendar.MINUTE);
} else if (cal.get(Calendar.MINUTE) > endWorkCal.get(Calendar.MINUTE)) {
// 当天工作开始时间在指定工作时段之后
continue;
} else {
// 当天工作开始时间刚好在指定工作时段开始时间
workMinutes += WORK_MINUTES_PER_DAY;
}
}
}
} else {
// 非指定日期当天的工作时间
workMinutes += WORK_MINUTES_PER_DAY;
}
}
return workMinutes;
}
}
```
以上代码中,我们首先定义了每天工作的分钟数为 8 * 60,即 480 分钟。然后将工作开始日期时间、工作结束日期时间和指定日期分别转换为 Calendar 对象,逐天遍历工作开始日期时间和工作结束日期时间之间的日期。对于每个非周末的日期,如果该日期是指定日期,则计算该日期的工作时间;否则,计算该日期的全天工作时间。
对于指定日期的工作时间计算,我们首先将工作时段字符串按分号拆分为多个时段,然后对于每个时段,将其开始时间和结束时间分别转换为 Calendar 对象。如果当天工作开始时间在指定工作时段之前,则计算该时段的全部工作时间;如果当天工作开始时间在指定工作时段之后,则跳过该时段不计算工作时间;如果当天工作开始时间在指定工作时段内,则计算该时段从开始时间到结束时间之间的工作时间。最后将所有的工作时间累加起来即可得到总的工作分钟数。
阅读全文