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) 5.计算设备工作时间内某天工作了多少分钟 单位(分钟)
时间: 2024-02-05 14:12:42 浏览: 102
以下是Java代码实现:
```
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DeviceWorkTimeCalculator {
private static final SimpleDateFormat FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 计算设备工作时间内某天工作了多少分钟
public static int calculateMinutes(String workTimeStr, Date beginTime, Date endTime, Date targetDate) throws ParseException {
int minutes = 0;
String[] workPeriods = workTimeStr.split(";");
Calendar calendar = Calendar.getInstance();
calendar.setTime(targetDate);
for (String workPeriod : workPeriods) {
String[] period = workPeriod.split("-");
Date start = FORMAT.parse(calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-" + calendar.get(Calendar.DAY_OF_MONTH) + " " + period[0]);
Date end = FORMAT.parse(calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-" + calendar.get(Calendar.DAY_OF_MONTH) + " " + period[1]);
// 如果开始时间和结束时间都在目标日期之前或之后,则直接跳过
if (start.after(endTime) || end.before(beginTime)) {
continue;
}
// 如果开始时间在目标日期之前,则将开始时间设为目标日期的零点
if (start.before(beginTime)) {
start = beginTime;
}
// 如果结束时间在目标日期之后,则将结束时间设为目标日期的23:59:59
if (end.after(endTime)) {
end = endTime;
}
int diffInMinutes = (int) ((end.getTime() - start.getTime()) / (1000 * 60));
minutes += diffInMinutes;
}
return minutes;
}
public static void main(String[] args) throws ParseException {
String workTimeStr = "08:00-12:00;13:00-17:00";
Date beginTime = FORMAT.parse("2021-09-01 00:00:00");
Date endTime = FORMAT.parse("2021-09-30 23:59:59");
Date targetDate = FORMAT.parse("2021-09-06 10:30:00");
int minutes = calculateMinutes(workTimeStr, beginTime, endTime, targetDate);
System.out.println("在" + FORMAT.format(targetDate) + "这一天,设备工作了" + minutes + "分钟。");
}
}
```
首先,我们将传入的设备工作时段字符串按分号分隔,每个分段再按照横杠分隔为开始时间和结束时间。然后,分别将开始时间和结束时间解析为Date类型,并判断该时间段是否与目标日期有重叠部分。如果有,则计算重叠部分的时间差,并加入到总分钟数中。最后返回总分钟数即可。注意要处理开始时间早于目标日期以及结束时间晚于目标日期的情况。
阅读全文