java 判斷兩個時間段是否重疊的案例
最近業(yè)務上遇到需要判斷兩個時間段是否存在重疊的情況,網(wǎng)上找了不少代碼。大佬們的思路過于簡潔了,有些理解不了。還只是個菜鳥碼農(nóng),還是多鍛煉鍛煉自己的思路。
思路很簡單:定義一個時間段的概念,既然是時間段就包含起始時間和終止時間這兩個時間點。構(gòu)造方法要保證起始時間在終止時間之前,這樣才是一個有效的時間段概念。
為TimeSlot這個類定義四個比較先后順序的方法,分別為:小于、大于、小于等于、大于等于。畫張簡單的時間線圖理解一下就明白了。當整個時間段作為一個整體時,只有時間段小于或大于另一個時間段時,它們才沒有重疊的交集。
代碼如下,有什么錯誤還請各位看官幫忙指出
package com.abc.common.util;
import lombok.Data;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
/**
* 日期工具類
* <p>
* 使用LocalDateTime存取或判斷
* </p>
* @see java.time.LocalDateTime
* @date 2020-6-29 10:20:42
*/
@Component
public class DateUtil {
/**
* 判斷兩個時間段是否重疊
* @param slot1
* @param slot2
* @return
*/
public static boolean overlapped(TimeSlot slot1, TimeSlot slot2) {
TimeSlot previous, next;
previous = slot1.startTime.isBefore(slot2.startTime) ? slot1 : slot2;
next = slot2.startTime.isAfter(slot1.startTime) ? slot2 : slot1;
// 這里業(yè)務需要,允許時間點的重疊
// 例如某個時間段的起始時間:2020-06-29 00:00:00
// 和另一個時間段的終止時間:2020-06-29 00:00:00
// 它們倆可以有交點。如果不需要這種邏輯只把le改成lt
// ,ge改成gt就可
return !(le(previous, next) || ge(previous, next));
}
/**
* 構(gòu)造一個時間段
* @param startTime
* @param endTime
* @return
*/
public static TimeSlot buildSlot(LocalDateTime startTime, LocalDateTime endTime) {
return new TimeSlot(startTime, endTime);
}
/**
* less equal
* 小于等于
* @param prev
* @param next
* @return
*/
private static boolean le(TimeSlot prev, TimeSlot next) {
return lt(prev, next) || next.endTime.isEqual(prev.startTime);
}
/**
* greater equal
* 大于等于
* @param prev
* @param next
* @return
*/
private static boolean ge(TimeSlot prev, TimeSlot next) {
return gt(prev, next) || prev.endTime.isEqual(next.startTime);
}
/**
* greater than
* 大于
* @param prev
* @param next
* @return
*/
private static boolean gt(TimeSlot prev, TimeSlot next) {
return prev.endTime.isBefore(next.startTime);
}
/**
* less than
* 小于
* @param prev
* @param next
* @return
*/
private static boolean lt(TimeSlot prev, TimeSlot next) {
return next.endTime.isBefore(prev.startTime);
}
/**
* 時間段類
*/
@Data
static class TimeSlot{
private LocalDateTime startTime;
private LocalDateTime endTime;
public TimeSlot(LocalDateTime startTime, LocalDateTime endTime) {
if (startTime.isAfter(endTime)) {
this.startTime = endTime;
this.endTime = startTime;
} else {
this.startTime = startTime;
this.endTime = endTime;
}
}
}
}
在業(yè)務代碼中調(diào)用:
// ...
if (DateUtil.overlapped(
DateUtil.buildSlot(beginTime, endTime),
DateUtil.buildSlot(beginTime1, endTime1)
)) {
// 時間段有重疊,寫下重疊情況的業(yè)務代碼
}
// ...
當然也可以把TimeSlot這個類拎出來,那樣或許更方便。
補充知識:Java計算Date類時間差的函數(shù)
我就廢話不多說了,大家還是直接看代碼吧~
public static String TimeDifference(long start, long end) {
long between = end - start;
long day = between / (24 * 60 * 60 * 1000);
long hour = (between / (60 * 60 * 1000) - day * 24);
long min = ((between / (60 * 1000)) - day * 24 * 60 - hour * 60);
long s = (between / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
long ms = (between - day * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000
- min * 60 * 1000 - s * 1000);
String timeDifference = day + "天" + hour + "小時" + min + "分" + s + "秒" + ms
+ "毫秒";
return timeDifference;
}
以上這篇java 判斷兩個時間段是否重疊的案例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java 文創(chuàng)商城系統(tǒng)的實現(xiàn)流程
讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+mysql+maven+tomcat實現(xiàn)一個文創(chuàng)商城系統(tǒng),大家可以在過程中查缺補漏,提升水平2021-11-11
eclipse springboot工程打war包方法及再Tomcat中運行的方法
這篇文章主要介紹了eclipse springboot工程打war包方法及再Tomcat中運行的方法,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08
logstash將mysql數(shù)據(jù)同步到elasticsearch方法詳解
這篇文章主要為大家介紹了logstash將mysql數(shù)據(jù)同步到elasticsearch方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
mybatis查詢返回Map<String,Object>類型的講解
這篇文章主要介紹了mybatis查詢返回Map<String,Object>類型的講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
maven項目install時忽略執(zhí)行test方法的總結(jié)
這篇文章主要介紹了maven項目install時忽略執(zhí)行test方法的總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03

