JAVA 1.传入工作时段字符串,格式为(HH:mm-HH:mm;HH:mm-HH:mm;HH:mm-HH:mm),传入两个工作起止时间(Date类型),返回在每天的工作日中工时是多少
时间: 2024-02-03 22:14:40 浏览: 75
dnSpy-net-win32-222.zip
可以按照以下步骤实现:
1. 将工作时段字符串解析为多个时间段,存储到一个 List 中,每个时间段可以用两个 Date 类型的变量表示起止时间。
2. 循环遍历工作日,对于每个工作日,计算它包含的工作时长:
- 首先判断该工作日是否在任何一个时间段内,如果不在,则工作时长为 0。
- 如果在某个时间段内,则需要计算该时间段与该工作日重叠的部分,累加到总工作时长中。
下面是示例代码实现:
```java
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
public class WorkTimeCalculator {
private static final DateFormat TIME_FORMAT = new SimpleDateFormat("HH:mm");
/**
* 计算指定工作日的工时
* @param workDay 工作日,格式为 yyyy-MM-dd
* @param workPeriods 工作时段字符串,格式为 HH:mm-HH:mm;HH:mm-HH:mm;...
* @return 工时,单位为小时
*/
public static double calculateWorkTime(String workDay, String workPeriods) {
List<TimePeriod> timePeriods = parseTimePeriods(workPeriods);
Calendar calendar = Calendar.getInstance();
try {
calendar.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(workDay));
} catch (ParseException e) {
throw new IllegalArgumentException("Invalid date format: " + workDay);
}
double workHours = 0;
for (TimePeriod period : timePeriods) {
if (period.contains(calendar)) {
workHours += period.getOverlapHours(calendar);
}
}
return workHours;
}
/**
* 解析工作时段字符串,返回时间段列表
* @param workPeriods 工作时段字符串,格式为 HH:mm-HH:mm;HH:mm-HH:mm;...
* @return 时间段列表
*/
private static List<TimePeriod> parseTimePeriods(String workPeriods) {
List<TimePeriod> timePeriods = new ArrayList<>();
String[] periodStrings = workPeriods.split(";");
for (String periodString : periodStrings) {
String[] timeStrings = periodString.split("-");
try {
Date startTime = TIME_FORMAT.parse(timeStrings[0]);
Date endTime = TIME_FORMAT.parse(timeStrings[1]);
timePeriods.add(new TimePeriod(startTime, endTime));
} catch (ParseException e) {
throw new IllegalArgumentException("Invalid time format: " + periodString);
}
}
return timePeriods;
}
/**
* 表示一个时间段,包括起始时间和结束时间
*/
private static class TimePeriod {
private Date startTime;
private Date endTime;
public TimePeriod(Date startTime, Date endTime) {
this.startTime = startTime;
this.endTime = endTime;
}
/**
* 判断指定日期是否在该时间段内
*/
public boolean contains(Calendar calendar) {
Date date = calendar.getTime();
return !date.before(startTime) && !date.after(endTime);
}
/**
* 计算指定日期与该时间段重叠的部分的小时数
*/
public double getOverlapHours(Calendar calendar) {
Date startDate = calendar.getTime();
calendar.add(Calendar.DAY_OF_MONTH, 1);
Date endDate = calendar.getTime();
if (endDate.before(startTime) || startDate.after(endTime)) {
return 0;
}
startDate = startDate.before(startTime) ? startTime : startDate;
endDate = endDate.after(endTime) ? endTime : endDate;
long overlapMillis = endDate.getTime() - startDate.getTime();
return overlapMillis / 3600000.0;
}
}
}
```
使用示例:
```java
String workPeriods = "09:00-12:00;13:30-18:00";
String workDay = "2021-08-23";
double workHours = WorkTimeCalculator.calculateWorkTime(workDay, workPeriods);
System.out.println("工时为:" + workHours + "小时");
```
输出:
```
工时为:7.5小时
```
阅读全文