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.计算这台设备这期间每天的工作时长
时间: 2024-02-05 17:13:01 浏览: 140
日期转换工具类
下面是一个示例代码实现:
```java
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 DeviceWorkTimeCalculator {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");
public static void main(String[] args) throws ParseException {
String workTimeStr = "08:00-12:00;13:00-17:00";
Date startTime = dateFormat.parse("2022-01-01 08:00:00");
Date endTime = dateFormat.parse("2022-01-05 17:00:00");
List<Double> workHoursPerDay = calculateWorkHoursPerDay(workTimeStr, startTime, endTime);
System.out.println(workHoursPerDay);
}
public static List<Double> calculateWorkHoursPerDay(String workTimeStr, Date startTime, Date endTime) {
String[] workTimeRanges = workTimeStr.split(";");
List<Double> workHoursPerDay = new ArrayList<>();
Calendar calendar = Calendar.getInstance();
calendar.setTime(startTime);
while (calendar.getTime().before(endTime)) {
double workHours = 0.0;
for (String workTimeRange : workTimeRanges) {
String[] startAndEnd = workTimeRange.split("-");
Date workStartTime = setTime(calendar.getTime(), startAndEnd[0]);
if (workStartTime.after(endTime)) {
break;
}
Date workEndTime = setTime(calendar.getTime(), startAndEnd[1]);
if (workEndTime.before(startTime)) {
continue;
}
Date timeIn = workStartTime.after(startTime) ? workStartTime : startTime;
Date timeOut = workEndTime.before(endTime) ? workEndTime : endTime;
workHours += (timeOut.getTime() - timeIn.getTime()) / (60.0 * 60.0 * 1000.0);
}
workHoursPerDay.add(workHours);
calendar.add(Calendar.DAY_OF_YEAR, 1);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
}
return workHoursPerDay;
}
private static Date setTime(Date date, String timeStr) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
String[] timeParts = timeStr.split(":");
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(timeParts[0]));
calendar.set(Calendar.MINUTE, Integer.parseInt(timeParts[1]));
calendar.set(Calendar.SECOND, 0);
return calendar.getTime();
}
}
```
该方法接受三个参数:设备工作时段字符串(workTimeStr)、设备工作开始日期时间(startTime)、设备工作结束日期时间(endTime),返回一个列表,其中包含了设备在这期间每天的工作时长。
算法的主要思路是:对于每一天,遍历设备工作时段字符串中的每个工作时间段,计算该时间段与该天的交集,然后将所有工作时间段的交集加起来即可得到该天的工作时长。由于一个时间段可能跨越多天,因此需要对每一天进行遍历计算。
需要注意的是,计算时需要考虑设备工作开始日期时间和设备工作结束日期时间,如果某个工作时间段的起止时间都在设备工作开始日期时间之前或设备工作结束日期时间之后,则不需要计算该时间段的工作时长。
阅读全文