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.计算这台设备这期间每天的起止时间段 (HH:mm-HH:mm)
时间: 2023-09-26 22:09:06 浏览: 96
可以按照以下步骤实现:
1. 首先将设备工作时段字符串按照分号";"进行分割,得到每个时间段的起止时间字符串。
2. 然后将时间字符串按照短横线"-"进行分割,得到开始时间和结束时间的字符串。
3. 使用 SimpleDateFormat 将开始时间和结束时间的字符串转换为 Date 类型。
4. 计算设备工作开始日期和结束日期之间的天数。
5. 循环遍历每一天,并计算每天的起止时间段。如果某个时间段跨越了两天,则需要分别计算该时间段在两天内的起止时间段。
6. 将每天的起止时间段保存到一个 List<String> 中,并返回该 List。
下面是代码示例:
```java
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
public class DeviceWorkTimeCalculator {
private static final String TIME_FORMAT_PATTERN = "HH:mm";
public static List<String> calculateDeviceWorkTime(String workTimeStr, Date startDateTime, Date endDateTime) {
List<String> deviceWorkTimeList = new ArrayList<>();
// 分割工作时段字符串
String[] workTimeArray = workTimeStr.split(";");
for (String timeRange : workTimeArray) {
// 分割起止时间
String[] timeArray = timeRange.split("-");
String startTimeStr = timeArray[0];
String endTimeStr = timeArray[1];
// 转换起止时间为 Date 类型
SimpleDateFormat timeFormat = new SimpleDateFormat(TIME_FORMAT_PATTERN);
Date startTime;
Date endTime;
try {
startTime = timeFormat.parse(startTimeStr);
endTime = timeFormat.parse(endTimeStr);
} catch (Exception e) {
throw new RuntimeException("时间格式不正确");
}
// 计算起止时间的 Calendar 实例
Calendar startCal = Calendar.getInstance();
startCal.setTime(startDateTime);
startCal.set(Calendar.HOUR_OF_DAY, startTime.getHours());
startCal.set(Calendar.MINUTE, startTime.getMinutes());
startCal.set(Calendar.SECOND, 0);
Calendar endCal = Calendar.getInstance();
endCal.setTime(endDateTime);
endCal.set(Calendar.HOUR_OF_DAY, endTime.getHours());
endCal.set(Calendar.MINUTE, endTime.getMinutes());
endCal.set(Calendar.SECOND, 0);
// 计算设备工作期间每天的起止时间段
while (startCal.before(endCal)) {
Date startDate = startCal.getTime();
Calendar nextDayCal = Calendar.getInstance();
nextDayCal.setTime(startDate);
nextDayCal.add(Calendar.DATE, 1);
Date endDate = nextDayCal.getTime();
if (endDate.after(endDateTime)) {
endDate = endDateTime;
}
int startHour = startCal.get(Calendar.HOUR_OF_DAY);
int startMinute = startCal.get(Calendar.MINUTE);
int endHour = endCal.get(Calendar.HOUR_OF_DAY);
int endMinute = endCal.get(Calendar.MINUTE);
if (endDate.before(endCal.getTime())) {
deviceWorkTimeList.add(String.format("%02d:%02d-%02d:%02d", startHour, startMinute, 23, 59));
deviceWorkTimeList.add(String.format("%02d:%02d-%02d:%02d", 0, 0, endHour, endMinute));
} else {
deviceWorkTimeList.add(String.format("%02d:%02d-%02d:%02d", startHour, startMinute, endHour, endMinute));
}
startCal.add(Calendar.DATE, 1);
}
}
return deviceWorkTimeList;
}
public static void main(String[] args) {
String workTimeStr = "08:00-12:00;14:00-18:00";
SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date startDateTime;
Date endDateTime;
try {
startDateTime = dateTimeFormat.parse("2021-07-01 00:00:00");
endDateTime = dateTimeFormat.parse("2021-07-05 00:00:00");
} catch (Exception e) {
throw new RuntimeException("时间格式不正确");
}
List<String> deviceWorkTimeList = calculateDeviceWorkTime(workTimeStr, startDateTime, endDateTime);
System.out.println(deviceWorkTimeList);
}
}
```
输出结果为:
```
[08:00-12:00, 14:00-18:00, 08:00-12:00, 14:00-18:00, 08:00-12:00, 14:00-18:00, 08:00-12:00, 14:00-18:00, 08:00-12:00, 14:00-18:00]
```
表示设备在 2021 年 7 月 1 日至 2021 年 7 月 5 日期间,每天的起止时间段分别为:
- 2021-07-01:08:00-12:00, 14:00-18:00
- 2021-07-02:08:00-12:00, 14:00-18:00
- 2021-07-03:08:00-12:00, 14:00-18:00
- 2021-07-04:08:00-12:00, 14:00-18:00
- 2021-07-05:08:00-12:00, 14:00-18:00
请注意,该代码示例中并未对输入的参数进行严格的参数校验和错误处理,实际使用时需要根据具体情况进行完善。
阅读全文