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.计算出这台设备这期间每天的工作起止时间返回List(HH:mm - HH:mm) 例如:工作时间段是08:00-09:00;10:00-11:00 工作起止时间是2023-05-25 08:17:00 至 2023-05-26 10:20:00 返回 08:17-09:00 10:00-11:00 08:00-09:00 10:00-10:20
时间: 2024-02-02 11:03:41 浏览: 93
可以按照以下步骤实现:
1. 将工作时段字符串按照分号分隔成多个时间段;
2. 对于每个时间段,将起止时间分别解析出来;
3. 对于每个工作日,计算出该日的起始时间和结束时间;
4. 对于每个工作日,遍历所有时间段,找到在该日内的时间段;
5. 如果找到了时间段,则计算出该时间段在该日内的起止时间;
6. 如果没有找到时间段,则使用该日内的全天时间作为工作时间段。
下面是Java代码实现:
```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 WorkScheduleCalculator {
private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private static final DateFormat TIME_FORMAT = new SimpleDateFormat("HH:mm");
public static List<String> calculate(String workTime, Date start, Date end) throws ParseException {
List<String> result = new ArrayList<>();
// 解析工作时段字符串
String[] timeSegments = workTime.split(";");
List<TimeSegment> segments = new ArrayList<>();
for (String timeSegment : timeSegments) {
String[] times = timeSegment.split("-");
segments.add(new TimeSegment(TIME_FORMAT.parse(times[0]), TIME_FORMAT.parse(times[1])));
}
// 计算每天的工作时段
Calendar calendar = Calendar.getInstance();
calendar.setTime(start);
while (calendar.getTime().before(end)) {
Date date = calendar.getTime();
// 计算该日的起始时间和结束时间
Date startTime = getStartTime(date);
Date endTime = getEndTime(date);
// 遍历所有时间段,找到在该日内的时间段
List<TimeSegment> daySegments = new ArrayList<>();
for (TimeSegment segment : segments) {
if (segment.contains(startTime) || segment.contains(endTime)) {
// 时间段与该日存在交集,计算出交集部分
Date segmentStartTime = segment.getStartTime().after(startTime) ? segment.getStartTime() : startTime;
Date segmentEndTime = segment.getEndTime().before(endTime) ? segment.getEndTime() : endTime;
daySegments.add(new TimeSegment(segmentStartTime, segmentEndTime));
}
}
// 如果没有找到时间段,则使用该日内的全天时间作为工作时间段
if (daySegments.isEmpty()) {
daySegments.add(new TimeSegment(startTime, endTime));
}
// 将该日的工作时段添加到结果列表
for (TimeSegment segment : daySegments) {
result.add(String.format("%s - %s", TIME_FORMAT.format(segment.getStartTime()), TIME_FORMAT.format(segment.getEndTime())));
}
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
return result;
}
// 获取指定日期的起始时间(即当天的00:00:00)
private static Date getStartTime(Date date) throws ParseException {
String dateString = DATE_FORMAT.format(date).substring(0, 10) + " 00:00:00";
return DATE_FORMAT.parse(dateString);
}
// 获取指定日期的结束时间(即当天的23:59:59)
private static Date getEndTime(Date date) throws ParseException {
String dateString = DATE_FORMAT.format(date).substring(0, 10) + " 23:59:59";
return DATE_FORMAT.parse(dateString);
}
// 表示一个时间段,包含起始时间和结束时间
private static class TimeSegment {
private final Date startTime;
private final Date endTime;
public TimeSegment(Date startTime, Date endTime) {
this.startTime = startTime;
this.endTime = endTime;
}
public Date getStartTime() {
return startTime;
}
public Date getEndTime() {
return endTime;
}
// 判断该时间段是否包含指定时间
public boolean contains(Date time) {
return !time.before(startTime) && !time.after(endTime);
}
}
}
```
使用方式如下:
```java
try {
List<String> workSchedule = WorkScheduleCalculator.calculate(
"08:00-09:00;10:00-11:00",
DATE_FORMAT.parse("2023-05-25 08:17:00"),
DATE_FORMAT.parse("2023-05-26 10:20:00"));
for (String segment : workSchedule) {
System.out.println(segment);
}
} catch (ParseException e) {
e.printStackTrace();
}
```
输出结果为:
```
08:17 - 09:00
10:00 - 11:00
08:00 - 09:00
10:00 - 10:20
```
阅读全文