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 12:12:49 浏览: 79
可以按照如下步骤实现:
1. 将工作时段字符串分割成多个时间段,每个时间段存储为一个包含开始时间和结束时间的数组。
2. 遍历每个时间段,判断指定日期是否在该时间段内。若在,则计算该时间段内工作了多少分钟,并累加到总工作分钟数中。
3. 返回总工作分钟数。
以下是一个可能的实现方式:
```java
import java.text.SimpleDateFormat;
import java.util.Date;
public class DeviceWorkTimeCalculator {
// 时间段分隔符
private static final String TIME_RANGE_SEPARATOR = ";";
// 时间格式
private static final SimpleDateFormat TIME_FORMAT = new SimpleDateFormat("HH:mm");
/**
* 计算指定日期在设备工作时段内的工作分钟数
*
* @param workTimeStr 设备工作时段字符串,格式为"HH:mm-HH:mm;HH:mm-HH:mm;HH:mm-HH:mm"
* @param workStartTime 设备工作开始日期时间
* @param workEndTime 设备工作结束日期时间
* @param targetDate 指定日期
* @return 工作分钟数
*/
public static int calculateWorkMinutes(String workTimeStr, Date workStartTime, Date workEndTime, Date targetDate) {
int workMinutes = 0;
// 将工作时段字符串分割成多个时间段
String[] timeRanges = workTimeStr.split(TIME_RANGE_SEPARATOR);
for (String timeRange : timeRanges) {
// 解析开始时间和结束时间
String[] split = timeRange.split("-");
Date startTime = parseTime(split[0]);
Date endTime = parseTime(split[1]);
// 计算指定日期在该时间段内的工作分钟数
if (isDateInRange(targetDate, workStartTime, workEndTime) && isTimeInRange(targetDate, startTime, endTime)) {
workMinutes += calculateMinutesBetween(targetDate, startTime, endTime);
}
}
return workMinutes;
}
/**
* 解析时间字符串为Date对象
*
* @param timeStr 时间字符串,格式为"HH:mm"
* @return Date对象
*/
private static Date parseTime(String timeStr) {
try {
return TIME_FORMAT.parse(timeStr);
} catch (Exception e) {
throw new IllegalArgumentException("Invalid time string: " + timeStr);
}
}
/**
* 判断指定日期是否在工作日期范围内
*
* @param date 指定日期
* @param workStartTime 工作开始日期时间
* @param workEndTime 工作结束日期时间
* @return true表示在范围内,false表示不在范围内
*/
private static boolean isDateInRange(Date date, Date workStartTime, Date workEndTime) {
return date.compareTo(workStartTime) >= 0 && date.compareTo(workEndTime) <= 0;
}
/**
* 判断指定时间是否在时间段内
*
* @param date 指定日期
* @param startTime 时间段开始时间
* @param endTime 时间段结束时间
* @return true表示在时间段内,false表示不在时间段内
*/
private static boolean isTimeInRange(Date date, Date startTime, Date endTime) {
return date.getTime() - startTime.getTime() >= 0 && endTime.getTime() - date.getTime() >= 0;
}
/**
* 计算指定日期在时间段内的工作分钟数
*
* @param date 指定日期
* @param startTime 时间段开始时间
* @param endTime 时间段结束时间
* @return 工作分钟数
*/
private static int calculateMinutesBetween(Date date, Date startTime, Date endTime) {
long startMillis = startTime.getTime();
long endMillis = endTime.getTime();
long targetMillis = date.getTime();
// 如果指定日期在开始时间之前,则以开始时间为准
if (targetMillis < startMillis) {
targetMillis = startMillis;
}
// 如果指定日期在结束时间之后,则以结束时间为准
if (targetMillis > endMillis) {
targetMillis = endMillis;
}
// 计算工作分钟数
return (int) ((targetMillis - startMillis) / 1000 / 60);
}
}
```
使用示例:
```java
// 设备工作时段字符串
String workTimeStr = "08:00-12:00;13:00-17:00;19:00-22:00";
// 设备工作开始时间和结束时间
Date workStartTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2021-07-01 08:00:00");
Date workEndTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2021-07-31 22:00:00");
// 指定日期
Date targetDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2021-07-06 10:30:00");
// 计算工作分钟数
int workMinutes = DeviceWorkTimeCalculator.calculateWorkMinutes(workTimeStr, workStartTime, workEndTime, targetDate);
System.out.println("工作分钟数:" + workMinutes);
```
阅读全文