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.传入指定日期 5.计算指定日期这台设备在当天的工作时长 单位(分钟)
时间: 2024-02-05 17:12:55 浏览: 52
可以按照以下步骤实现:
1. 首先,将设备工作时段字符串解析成一个列表,其中每个元素代表一个时段。
可以使用String类的split方法将字符串按照";"分割成不同的时段,然后再遍历每个时段,使用split方法将其分割成起始时间和结束时间,存储成两个Date类型的变量,并将其加入到一个List中。
2. 然后,比较传入的设备工作开始日期时间和结束日期时间是否在指定日期之前或之后。如果是,则该设备在指定日期当天不工作,直接返回0。
3. 如果指定日期在设备工作时间范围内,则计算出指定日期当天的工作时长。首先将指定日期的0时0分0秒和23时59分59秒作为起始时间和结束时间,然后遍历设备工作时段列表,将每个时段与指定日期当天的起始时间和结束时间进行比较,计算出当天该设备的工作时长。
下面是代码示例:
```
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class DeviceWorkTimeCalculator {
public static void main(String[] args) {
String workTimeStr = "08:00-12:00;13:00-17:00"; // 设备工作时段字符串
Date workStartTime = parseDateTime("2022-01-01 08:00:00"); // 设备工作开始日期时间
Date workEndTime = parseDateTime("2022-01-01 17:00:00"); // 设备工作结束日期时间
Date specifiedDate = parseDate("2022-01-01"); // 指定日期
List<Date[]> workTimeList = parseWorkTime(workTimeStr); // 解析设备工作时段字符串
if (specifiedDate.before(workStartTime) || specifiedDate.after(workEndTime)) {
// 如果指定日期在设备工作时间范围之外,则该设备当天不工作
System.out.println("该设备在指定日期当天不工作");
return;
}
// 计算指定日期当天的工作时长
int workMinutes = calculateWorkMinutes(workTimeList, specifiedDate);
System.out.println("该设备在指定日期当天的工作时长为:" + workMinutes + "分钟");
}
/**
* 解析设备工作时段字符串
*/
private static List<Date[]> parseWorkTime(String workTimeStr) {
List<Date[]> workTimeList = new ArrayList<>();
String[] workTimeArr = workTimeStr.split(";");
for (String workTime : workTimeArr) {
String[] timeArr = workTime.split("-");
Date startTime = parseTime(timeArr[0]);
Date endTime = parseTime(timeArr[1]);
workTimeList.add(new Date[]{startTime, endTime});
}
return workTimeList;
}
/**
* 计算指定日期当天的工作时长
*/
private static int calculateWorkMinutes(List<Date[]> workTimeList, Date specifiedDate) {
int workMinutes = 0;
Date startOfDay = getStartOfDay(specifiedDate);
Date endOfDay = getEndOfDay(specifiedDate);
for (Date[] workTime : workTimeList) {
if (workTime[0].after(endOfDay) || workTime[1].before(startOfDay)) {
// 如果该时段与指定日期当天的时间不重叠,则跳过
continue;
}
Date startTime = workTime[0].after(startOfDay) ? workTime[0] : startOfDay; // 取较晚的时间为起始时间
Date endTime = workTime[1].before(endOfDay) ? workTime[1] : endOfDay; // 取较早的时间为结束时间
workMinutes += (int) ((endTime.getTime() - startTime.getTime()) / (1000 * 60)); // 计算工作时长(单位:分钟)
}
return workMinutes;
}
/**
* 将字符串解析成Date类型的时间(yyyy-MM-dd HH:mm:ss)
*/
private static Date parseDateTime(String dateTimeStr) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return sdf.parse(dateTimeStr);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
/**
* 将字符串解析成Date类型的日期(yyyy-MM-dd)
*/
private static Date parseDate(String dateStr) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
return sdf.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
/**
* 将字符串解析成Date类型的时间(HH:mm)
*/
private static Date parseTime(String timeStr) {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
try {
return sdf.parse(timeStr);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
/**
* 获取指定日期的0时0分0秒
*/
private static Date getStartOfDay(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
try {
return sdf.parse(sdf.format(date));
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
/**
* 获取指定日期的23时59分59秒
*/
private static Date getEndOfDay(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 23:59:59");
try {
return sdf.parse(sdf.format(date));
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
```
该示例中,假设设备工作时段为"08:00-12:00;13:00-17:00",设备工作开始日期时间为"2022-01-01 08:00:00",设备工作结束日期时间为"2022-01-01 17:00:00",指定日期为"2022-01-01"。运行该程序,将输出"该设备在指定日期当天的工作时长为:480分钟",即该设备在指定日期当天的工作时长为8小时(单位:分钟)。
阅读全文