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)
时间: 2024-02-05 17:14:23 浏览: 73
可以按照以下步骤实现:
1. 解析工作时段字符串,将每个时间段存储为起始时间和结束时间的数组,以便于后续计算。可以使用 String 类的 split() 方法和 SimpleDateFormat 类的 parse() 方法来实现。
2. 计算出工作开始日期和结束日期之间的天数,并循环遍历每一天。
3. 对于每一天,先判断该天是否在工作日范围内。如果不在,则跳过该天的计算;如果在,则计算该天的工作时间。
4. 对于工作时间的计算,可以先计算出该天开始的时间和结束的时间,然后循环遍历每个工作时间段,将工作时间段和该天的时间段取交集,得到当天的实际工作时间。
5. 将每天的实际工作时间保存到一个 Map 中,以日期为键,工作时间段数组为值。
下面是一个可能的实现代码(仅供参考):
```java
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
public class WorkTimeCalculator {
private static final SimpleDateFormat TIME_FORMAT = new SimpleDateFormat("HH:mm");
/**
* 计算指定时间段内每天的工作时间
* @param workHours 工作时段字符串,格式为 "HH:mm-HH:mm;HH:mm-HH:mm;...",表示多个工作时间段
* @param startTime 工作开始时间
* @param endTime 工作结束时间
* @return Map,键为日期(yyyy-MM-dd),值为该天的工作时间段数组
*/
public static Map<String, List<Date[]>> calculate(String workHours, Date startTime, Date endTime) {
// 解析工作时段字符串,得到每个工作时间段的起始时间和结束时间
String[] timeRanges = workHours.split(";");
List<Date[]> workTimeList = new ArrayList<>();
for (String timeRange : timeRanges) {
String[] parts = timeRange.split("-");
try {
Date start = TIME_FORMAT.parse(parts[0]);
Date end = TIME_FORMAT.parse(parts[1]);
workTimeList.add(new Date[]{start, end});
} catch (ParseException e) {
e.printStackTrace();
}
}
// 计算开始日期和结束日期之间的天数,并循环遍历每一天
Map<String, List<Date[]>> result = new LinkedHashMap<>();
Calendar calendar = Calendar.getInstance();
calendar.setTime(startTime);
while (!calendar.getTime().after(endTime)) {
// 判断该天是否在工作日范围内
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
if (dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY) {
calendar.add(Calendar.DAY_OF_MONTH, 1);
continue;
}
// 计算该天的工作时间
Date startOfDay = truncateToDay(calendar.getTime()); // 该天的开始时间
Date endOfDay = addDays(startOfDay, 1); // 该天的结束时间
List<Date[]> workTimeOfDayList = new ArrayList<>();
for (Date[] workTime : workTimeList) {
Date startOfWorkTime = addDays(startOfDay, getTimeInMinutes(workTime[0])); // 工作时间段的开始时间
Date endOfWorkTime = addDays(startOfDay, getTimeInMinutes(workTime[1])); // 工作时间段的结束时间
if (startOfWorkTime.before(endOfDay) && endOfWorkTime.after(startOfDay)) { // 该工作时间段和该天有交集
Date start = startOfWorkTime.after(startOfDay) ? startOfWorkTime : startOfDay;
Date end = endOfWorkTime.before(endOfDay) ? endOfWorkTime : endOfDay;
workTimeOfDayList.add(new Date[]{start, end});
}
}
if (!workTimeOfDayList.isEmpty()) {
result.put(formatDate(calendar.getTime()), workTimeOfDayList);
}
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
return result;
}
/**
* 将指定日期的时间部分截断为 00:00:00
*/
private static Date truncateToDay(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTime();
}
/**
* 在指定的日期上加上指定的分钟数
*/
private static Date addDays(Date date, int minutes) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.MINUTE, minutes);
return calendar.getTime();
}
/**
* 将时间转换为分钟数
*/
private static int getTimeInMinutes(Date time) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(time);
return calendar.get(Calendar.HOUR_OF_DAY) * 60 + calendar.get(Calendar.MINUTE);
}
/**
* 将日期格式化为 yyyy-MM-dd
*/
private static String formatDate(Date date) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
return dateFormat.format(date);
}
}
```
使用示例:
```java
String workHours = "09:00-12:00;14:00-18:00";
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date startTime = dateFormat.parse("2021-05-01 10:30:00");
Date endTime = dateFormat.parse("2021-05-05 16:30:00");
Map<String, List<Date[]>> result = WorkTimeCalculator.calculate(workHours, startTime, endTime);
for (Map.Entry<String, List<Date[]>> entry : result.entrySet()) {
String date = entry.getKey();
List<Date[]> workTimeList = entry.getValue();
System.out.println(date + ":");
for (Date[] workTime : workTimeList) {
System.out.println(" " + dateFormat.format(workTime[0]) + " - " + dateFormat.format(workTime[1]));
}
}
```
输出结果:
```
2021-05-03:
2021-05-03 10:30:00 - 2021-05-03 12:00:00
2021-05-03 14:00:00 - 2021-05-03 18:00:00
2021-05-04:
2021-05-04 09:00:00 - 2021-05-04 12:00:00
2021-05-04 14:00:00 - 2021-05-04 18:00:00
```
阅读全文