判断多个时间段是否有间隔
实体类内容
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 }
主方法内容
//判断多个时间段是否有时间间隔 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())) { // 当前时间段的开始日期早于上一个时间段的结束日期,存在重叠,这不一定是问题 // 但我们仍然将当前时间段的结束日期作为新的previousenddate previousenddate = currentperiod.getenddate(); } else if ((!previousenddate.isequal(currentperiod.getstartdate()) && !previousenddate.plusdays(1l).isequal(currentperiod.getstartdate()))) { // 发现了间隔 return false; } else { // 相邻时间段之间没有间隔 previousenddate = currentperiod.getenddate(); } } return true; // 所有时间段都已遍历完毕,且没有发现时间间隔 }
判断时间段集合是否与某时间段重合
实体类内容
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; }
主方法内容
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; }
到此这篇关于java判断多个时间段是否重合的方法小结的文章就介绍到这了,更多相关java判断时间段是否重合内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论