java 判斷兩個(gè)時(shí)間段是否重疊的案例
最近業(yè)務(wù)上遇到需要判斷兩個(gè)時(shí)間段是否存在重疊的情況,網(wǎng)上找了不少代碼。大佬們的思路過于簡潔了,有些理解不了。還只是個(gè)菜鳥碼農(nóng),還是多鍛煉鍛煉自己的思路。
思路很簡單:定義一個(gè)時(shí)間段的概念,既然是時(shí)間段就包含起始時(shí)間和終止時(shí)間這兩個(gè)時(shí)間點(diǎn)。構(gòu)造方法要保證起始時(shí)間在終止時(shí)間之前,這樣才是一個(gè)有效的時(shí)間段概念。
為TimeSlot這個(gè)類定義四個(gè)比較先后順序的方法,分別為:小于、大于、小于等于、大于等于。畫張簡單的時(shí)間線圖理解一下就明白了。當(dāng)整個(gè)時(shí)間段作為一個(gè)整體時(shí),只有時(shí)間段小于或大于另一個(gè)時(shí)間段時(shí),它們才沒有重疊的交集。
代碼如下,有什么錯(cuò)誤還請(qǐng)各位看官幫忙指出
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 { /** * 判斷兩個(gè)時(shí)間段是否重疊 * @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è)務(wù)需要,允許時(shí)間點(diǎn)的重疊 // 例如某個(gè)時(shí)間段的起始時(shí)間:2020-06-29 00:00:00 // 和另一個(gè)時(shí)間段的終止時(shí)間:2020-06-29 00:00:00 // 它們倆可以有交點(diǎn)。如果不需要這種邏輯只把le改成lt // ,ge改成gt就可 return !(le(previous, next) || ge(previous, next)); } /** * 構(gòu)造一個(gè)時(shí)間段 * @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); } /** * 時(shí)間段類 */ @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è)務(wù)代碼中調(diào)用:
// ... if (DateUtil.overlapped( DateUtil.buildSlot(beginTime, endTime), DateUtil.buildSlot(beginTime1, endTime1) )) { // 時(shí)間段有重疊,寫下重疊情況的業(yè)務(wù)代碼 } // ...
當(dāng)然也可以把TimeSlot這個(gè)類拎出來,那樣或許更方便。
補(bǔ)充知識(shí):Java計(jì)算Date類時(shí)間差的函數(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 + "小時(shí)" + min + "分" + s + "秒" + ms + "毫秒"; return timeDifference; }
以上這篇java 判斷兩個(gè)時(shí)間段是否重疊的案例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于Java+SpringBoot+Vue前后端分離實(shí)現(xiàn)倉庫管理系統(tǒng)
這篇文章主要介紹了一個(gè)完整的倉庫管理系統(tǒng)是基于Java+Springboot + Vue前后端分離編寫的,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06Servlet輸出一個(gè)驗(yàn)證碼圖片的實(shí)現(xiàn)方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Servlet輸出一個(gè)驗(yàn)證碼圖片的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01springboot中spring.profiles.include的妙用分享
這篇文章主要介紹了springboot中spring.profiles.include的妙用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08mybatis對(duì)象List<String> List<Integer>屬性映射方式
這篇文章主要介紹了mybatis對(duì)象List<String> List<Integer>屬性映射方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12java中l(wèi)ist使用時(shí)需避免的場景總結(jié)
眾所周知,Java為開發(fā)者提供了多種集合類的實(shí)現(xiàn),其中幾乎所有業(yè)務(wù)代碼都需要用到List,但List的錯(cuò)誤使用也會(huì)導(dǎo)致諸多問題,所以本文我們就來看一看幾個(gè)錯(cuò)誤使用List的場景吧2023-10-10java并發(fā)學(xué)習(xí)之BlockingQueue實(shí)現(xiàn)生產(chǎn)者消費(fèi)者詳解
這篇文章主要介紹了java并發(fā)學(xué)習(xí)之BlockingQueue實(shí)現(xiàn)生產(chǎn)者消費(fèi)者詳解,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11SpringBoot整合Elasticsearch實(shí)現(xiàn)索引和文檔的操作方法
Elasticsearch 基于 Apache Lucene 構(gòu)建,采用 Java 編寫,并使用 Lucene 構(gòu)建索引、提供搜索功能,本文分步驟通過綜合案例給大家分享SpringBoot整合Elasticsearch的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧2021-05-05詳解idea maven項(xiàng)目如何使用lib下得jar包
這篇文章主要介紹了詳解idea maven項(xiàng)目如何使用lib下得jar包,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12