Java判斷多個時間段是否重合的方法小結(jié)
更新時間:2025年02月23日 11:09:06 作者:骨力
這篇文章主要為大家詳細(xì)介紹了Java中判斷多個時間段是否重合的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
判斷多個時間段是否有間隔
實(shí)體類內(nèi)容
public class DateRangeStr {
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM", timezone = "GMT+8")
private String startDate;//格式:yyyy-MM-dd
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM", timezone = "GMT+8")
private String endDate;//格式:yyyy-MM-dd
}
主方法內(nèi)容
//判斷多個時間段是否有時間間隔 true無間隔 false有間隔
public boolean hasNoGaps(List<DateRangeStr> sortedStrRanges) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
if (sortedStrRanges == null || sortedStrRanges.size() <= 0) return false;
if (sortedStrRanges.size() == 1) return true;
List<DateRange> timePeriods = new ArrayList<>();
for (DateRangeStr ss : sortedStrRanges) {
LocalDate startDate = LocalDate.parse(ss.getStartDate(), formatter);
LocalDate endDate = LocalDate.parse(ss.getEndDate(), formatter);
DateRange dr = new DateRange();
dr.setStartDate(startDate);
dr.setEndDate(endDate);
timePeriods.add(dr);
}
Collections.sort(timePeriods, Comparator.comparing(DateRange::getStartDate));
LocalDate previousEndDate = timePeriods.get(0).getEndDate();
for (int i = 1; i < timePeriods.size(); i++) {
DateRange currentPeriod = timePeriods.get(i);
if (previousEndDate.isAfter(currentPeriod.getStartDate())) {
// 當(dāng)前時間段的開始日期早于上一個時間段的結(jié)束日期,存在重疊,這不一定是問題
// 但我們?nèi)匀粚?dāng)前時間段的結(jié)束日期作為新的previousEndDate
previousEndDate = currentPeriod.getEndDate();
} else if ((!previousEndDate.isEqual(currentPeriod.getStartDate()) && !previousEndDate.plusDays(1L).isEqual(currentPeriod.getStartDate()))) {
// 發(fā)現(xiàn)了間隔
return false;
} else {
// 相鄰時間段之間沒有間隔
previousEndDate = currentPeriod.getEndDate();
}
}
return true; // 所有時間段都已遍歷完畢,且沒有發(fā)現(xiàn)時間間隔
}
判斷時間段集合是否與某時間段重合
實(shí)體類內(nèi)容
public class TimeInterval {
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM", timezone = "GMT+8")
private String start;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM", timezone = "GMT+8")
private String end;
}
主方法內(nèi)容
private static YearMonth parseYearMonth(String input) {
try {
return YearMonth.parse(input, MONTH_FORMATTER);
} catch (Exception e) {
throw new IllegalArgumentException("Invalid date format: " + input, e);
}
}
public static boolean overlapsOrContainedInIntervals(List<TimeInterval> intervals, String startDate,String endDate) {
YearMonth yearMonthAStart = parseYearMonth(startDate);
YearMonth yearMonthAEnd = parseYearMonth(endDate);
for (TimeInterval interval : intervals) {
YearMonth start = parseYearMonth(interval.getStart());
YearMonth end = parseYearMonth(interval.getEnd());
// 檢查重疊或包含
if (!start.isAfter(yearMonthAEnd) && !end.isBefore(yearMonthAStart)) {
return true;
}
}
return false;
}
到此這篇關(guān)于Java判斷多個時間段是否重合的方法小結(jié)的文章就介紹到這了,更多相關(guān)Java判斷時間段是否重合內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot項目中公共字段填充的實(shí)現(xiàn)
本文主要介紹了SpringBoot項目中公共字段填充的實(shí)現(xiàn),利用SpringBoot的Aop思想和自定義注解和反射機(jī)制的方法來實(shí)現(xiàn),具有一定的參考價值,感興趣的可以了解一下2023-10-10
詳解MyBatis Generator自動創(chuàng)建代碼(dao,mapping,poji)
這篇文章主要介紹了詳解MyBatis Generator自動創(chuàng)建代碼(dao,mapping,poji)的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-10-10
Maven Profile多環(huán)境構(gòu)建實(shí)戰(zhàn)指南
在現(xiàn)代企業(yè)級Java項目開發(fā)中,面對開發(fā)(dev)、測試(test)、預(yù)發(fā)布(staging)、生產(chǎn)(prod)等多套環(huán)境的差異化配置管理,本文將從實(shí)戰(zhàn)角度深入剖析Maven Profile的多環(huán)境構(gòu)建體系,需要的朋友可以參考下2025-05-05
使用Idea快速搭建SpringMVC項目的詳細(xì)步驟記錄
這篇文章主要給大家介紹了關(guān)于使用Idea快速搭建SpringMVC項目的詳細(xì)步驟,Spring?MVC是一種基于MVC模式的框架,它是Spring框架的一部分,它提供了一種更簡單和更有效的方式來構(gòu)建Web應(yīng)用程序,需要的朋友可以參考下2024-05-05

