import java.time.Duration;import java.time.LocalTime;public class TimeOverlapChecker { public static boolean isOverlap(LocalTime start1, LocalTime end1, LocalTime start2, LocalTime end2) { // 如果开始时间或结束时间为空,则不重叠 if (start1 == null || end1 == null || start2 == null || end2 == null) { return false; } // 将开始时间和结束时间转换为持续时间 Duration duration1 = Duration.between(start1, end1); Duration duration2 = Duration.between(start2, end2); // 如果持续时间为0,则不重叠 if (duration1.isZero() || duration1.isNegative() || duration2.isZero() || duration2.isNegative()) { return false; } // 计算第一个时间段的开始时间和结束时间的分钟数 int start1Minutes = start1.toSecondOfDay() / 60; int end1Minutes = end1.toSecondOfDay() / 60; // 如果结束时间小于开始时间,则表示跨夜,需要加上一天的分钟数 if (end1.isBefore(start1)) { end1Minutes += 24 * 60; } // 计算第二个时间段的开始时间和结束时间的分钟数 int start2Minutes = start2.toSecondOfDay() / 60; int end2Minutes = end2.toSecondOfDay() / 60; // 如果结束时间小于开始时间,则表示跨夜,需要加上一天的分钟数 if (end2.isBefore(start2)) { end2Minutes += 24 * 60; } // 计算两个时间段的开始时间和结束时间的最大值和最小值 int earliestStart = Math.min(start1Minutes, start2Minutes); int latestEnd = Math.max(end1Minutes, end2Minutes); // 如果最大持续时间小于等于两个持续时间之和,则重叠 return (latestEnd - earliestStart) <= (duration1.toMinutes() + duration2.toMinutes()); }}
时间: 2024-02-15 19:27:25 浏览: 16
这段代码看起来是Java代码,它实现了一个时间重叠检查器,可以用于检查两个时间段是否重叠。在代码中,它使用了Java 8的时间API来处理时间相关的操作,比如将时间转换为持续时间,计算时间的分钟数等等。具体来说,代码将两个时间段的开始时间和结束时间转换为持续时间,然后计算每个时间段的开始时间和结束时间的分钟数,并检查是否跨夜,最后计算两个时间段的最大持续时间和最小持续时间之和,如果最大持续时间小于等于这个和,则两个时间段重叠。
相关问题
.探索jdk 8 日期相关的类,如 LocalDate、LocalTime。LocalDateTime及Calendar类
以下是关于JDK 8日期相关类的介绍和示例:
1. LocalDate类:
- LocalDate类表示一个不可变的日期对象,它只包含日期部分(年、月、日)。
- 使用`now()`方法获取当前日期。
- 使用`of()`方法创建指定日期。
- 使用`getXXX()`方法获取日期的年、月、日等部分。
- 使用`plusXXX()`和`minusXXX()`方法进行日期的加减操作。
- 使用`isXXX()`方法判断日期的属性,如是否为闰年等。
示例代码:
```java
import java.time.LocalDate;
// 获取当前日期
LocalDate currentDate = LocalDate.now();
System.out.println("当前日期: " + currentDate);
// 创建指定日期
LocalDate specificDate = LocalDate.of(2022, 1, 1);
System.out.println("指定日期: " + specificDate);
// 获取日期的年、月、日
int year = currentDate.getYear();
int month = currentDate.getMonthValue();
int day = currentDate.getDayOfMonth();
System.out.println("年: " + year + ", 月: " + month + ", 日: " + day);
// 日期的加减操作
LocalDate futureDate = currentDate.plusDays(7);
LocalDate pastDate = currentDate.minusMonths(1);
System.out.println("未来日期: " + futureDate);
System.out.println("过去日期: " + pastDate);
// 判断是否为闰年
boolean isLeapYear = currentDate.isLeapYear();
System.out.println("是否为闰年: " + isLeapYear);
```
2. LocalTime类:
- LocalTime类表示一个不可变的时间对象,它只包含时间部分(时、分、秒、纳秒)。
- 使用`now()`方法获取当前时间。
- 使用`of()`方法创建指定时间。
- 使用`getXXX()`方法获取时间的时、分、秒等部分。
- 使用`plusXXX()`和`minusXXX()`方法进行时间的加减操作。
示例代码:
```java
import java.time.LocalTime;
// 获取当前时间
LocalTime currentTime = LocalTime.now();
System.out.println("当前时间: " + currentTime);
// 创建指定时间
LocalTime specificTime = LocalTime.of(12, 30, 0);
System.out.println("指定时间: " + specificTime);
// 获取时间的时、分、秒
int hour = currentTime.getHour();
int minute = currentTime.getMinute();
int second = currentTime.getSecond();
System.out.println("时: " + hour + ", 分: " + minute + ", 秒: " + second);
// 时间的加减操作
LocalTime futureTime = currentTime.plusHours(2);
LocalTime pastTime = currentTime.minusMinutes(30);
System.out.println("未来时间: " + futureTime);
System.out.println("过去时间: " + pastTime);
```
3. LocalDateTime类:
- LocalDateTime类表示一个不可变的日期时间对象,它包含日期和时间部分。
- 使用`now()`方法获取当前日期时间。
- 使用`of()`方法创建指定日期时间。
- 使用`getXXX()`方法获取日期时间的年、月、日、时、分、秒等部分。
- 使用`plusXXX()`和`minusXXX()`方法进行日期时间的加减操作。
示例代码:
```java
import java.time.LocalDateTime;
// 获取当前日期时间
LocalDateTime currentDateTime = LocalDateTime.now();
System.out.println("当前日期时间: " + currentDateTime);
// 创建指定日期时间
LocalDateTime specificDateTime = LocalDateTime.of(2022, 1, 1, 12, 30, 0);
System.out.println("指定日期时间: " + specificDateTime);
// 获取日期时间的年、月、日、时、分、秒
int year = currentDateTime.getYear();
int month = currentDateTime.getMonthValue();
int day = currentDateTime.getDayOfMonth();
int hour = currentDateTime.getHour();
int minute = currentDateTime.getMinute();
int second = currentDateTime.getSecond();
System.out.println("年: " + year + ", 月: " + month + ", 日: " + day);
System.out.println("时: " + hour + ", 分: " + minute + ", 秒: " + second);
// 日期时间的加减操作
LocalDateTime futureDateTime = currentDateTime.plusDays(7);
LocalDateTime pastDateTime = currentDateTime.minusMonths(1);
System.out.println("未来日期时间: " + futureDateTime);
System.out.println("过去日期时间: " + pastDateTime);
```
4. Calendar类:
- Calendar类是Java旧版的日期时间处理类,JDK 8之后推荐使用新的日期时间API。
- Calendar类可以用于获取和设置日期时间的各个部分,如年、月、日、时、分、秒等。
- 使用`getInstance()`方法获取当前日期时间的Calendar实例。
- 使用`get()`方法获取日期时间的各个部分。
- 使用`set()`方法设置日期时间的各个部分。
示例代码:
```java
import java.util.Calendar;
// 获取当前日期时间的Calendar实例
Calendar currentCalendar = Calendar.getInstance();
System.out.println("当前日期时间: " + currentCalendar.getTime());
// 获取日期时间的年、月、日、时、分、秒
int year = currentCalendar.get(Calendar.YEAR);
int month = currentCalendar.get(Calendar.MONTH) + 1; // 月份从0开始,需要加1
int day = currentCalendar.get(Calendar.DAY_OF_MONTH);
int hour = currentCalendar.get(Calendar.HOUR_OF_DAY);
int minute = currentCalendar.get(Calendar.MINUTE);
int second = currentCalendar.get(Calendar.SECOND);
System.out.println("年: " + year + ", 月: " + month + ", 日: " + day);
System.out.println("时: " + hour + ", 分: " + minute + ", 秒: " + second);
// 设置日期时间的年、月、日、时、分、秒
currentCalendar.set(Calendar.YEAR, 2022);
currentCalendar.set(Calendar.MONTH, 0); // 月份从0开始,0表示1月
currentCalendar.set(Calendar.DAY_OF_MONTH, 1);
currentCalendar.set(Calendar.HOUR_OF_DAY, 12);
currentCalendar.set(Calendar.MINUTE, 30);
currentCalendar.set(Calendar.SECOND, 0);
System.out.println("设置后的日期时间: " + currentCalendar.getTime());
```
java 1.传入时间段列表(格式为hh:mm-hh:mm)2.传入日期时间 请计算给定分钟后的日期时间 只考虑工作时段
以下是Java代码示例实现,假设工作时间为每天的 9:00 - 18:00:
```java
import java.time.LocalTime;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.ArrayList;
public class WorkTimeCalculator {
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("HH:mm");
public static LocalDateTime calculate(LocalDateTime startDateTime, int minutes, List<String> workHours) {
// 将时间段转换为 LocalTime 类型
List<LocalTime[]> workTimeRanges = new ArrayList<>();
for (String workHour : workHours) {
String[] tokens = workHour.split("-");
LocalTime startTime = LocalTime.parse(tokens[0], FORMATTER);
LocalTime endTime = LocalTime.parse(tokens[1], FORMATTER);
workTimeRanges.add(new LocalTime[]{startTime, endTime});
}
// 计算结束时间
LocalDateTime endDateTime = startDateTime.plusMinutes(minutes);
while (!isWorkTime(endDateTime.toLocalTime(), workTimeRanges)) {
endDateTime = endDateTime.plusMinutes(1);
}
return endDateTime;
}
private static boolean isWorkTime(LocalTime time, List<LocalTime[]> workTimeRanges) {
for (LocalTime[] range : workTimeRanges) {
if (time.isAfter(range[0]) && time.isBefore(range[1])) {
return true;
}
}
return false;
}
}
```
调用示例:
```java
List<String> workHours = new ArrayList<>();
workHours.add("09:00-12:00");
workHours.add("13:00-18:00");
LocalDateTime startDateTime = LocalDateTime.of(2021, 9, 1, 10, 30);
int minutes = 90;
LocalDateTime endDateTime = WorkTimeCalculator.calculate(startDateTime, minutes, workHours);
System.out.println(endDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
```
输出结果为:
```
2021-09-01 12:00:00
```
说明在给定的工作时间段内,从 10:30 开始,90 分钟后的时间是 12:00。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)