因为项目需求用到比较给定时间段是否与已知时间段有重叠,所以写了一个比较简单易懂的方法,经测试可以满足本人目前的需求,大家如果发现该方法有什么问题可以提出来,如果有更好的方法也可以分享。
package com.demo;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** 判断给定时间段[X0,X1]是否与已知不连续正序显示的时间段存在重叠* 思路:1.将已知时间段的起始时间和结束时间分别存储在两个list中**/
public class isOverlappingPeriod {/*** 判断给定时间段[startX,endX]是否与已知时间段存在交集,不存在返回true* @param startX 例:2020/02/18 00:00:00* @param endX 例:2020/04/18 24:00:00* @param originList 正序存储的时间段集合[{start:A0,end:A1},{start:B0,end:B1}]* @return*/public static boolean isNormal(String startX,String endX,List<Map<String, Object>> originList){if (!isEmpty(startX) && !isEmpty(endX)) {startX = formatDate(startX);endX = formatDate(endX);if (originList != null && originList.size() > 0) {List<String> startList = new ArrayList<String>();List<String> endList = new ArrayList<String>();for (int i = 0; i < originList.size(); i++) {startList.add(formatDate((String) originList.get(i).get("start")));endList.add(formatDate((String) originList.get(i).get("end")));}String minStart = startList.get(0);String maxEnd = endList.get(endList.size()-1);if (endX.compareTo(minStart) < 0) {return true;} if (startX.compareTo(maxEnd) > 0) {return true;}int minStartIndex = 0;if (startX.compareTo(minStart) > 0) {if (startX.compareTo(endList.get(minStartIndex)) > 0) {// 即startX>A1for (int i = minStartIndex; i < startList.size(); i++) {if (startX.compareTo(startList.get(i)) < 0) {if (endX.compareTo(startList.get(i)) < 0) {return true;}} else {minStartIndex += 1;continue;}}}}}}return false;}public static boolean isEmpty(String object) {if (object == null) {object = "";}return object.length() == 0;}public static String formatDate(String date) {if (date != null) {date = date.replace("/", "").replace(":", "").replace(" ", "");}else {date = "";}return date;}public static void main(String[] args) {List<Map<String, Object>> originList = new ArrayList<Map<String,Object>>();Map<String, Object> map1 = new HashMap<String, Object>();map1.put("start", "2019/08/01 00:00:00");map1.put("end", "2019/12/31 24:00:00");originList.add(map1);Map<String, Object> map2 = new HashMap<String, Object>();map2.put("start", "2020/02/14 00:00:00");map2.put("end", "2020/02/29 24:00:00");originList.add(map2);String startX = "2019/03/18 00:00:00";String endX = "2019/07/30 24:00:00";System.err.println("最小值之前["+startX+","+endX+"]:"+isNormal(startX, endX, originList));String startX2 = "2020/03/01 00:00:00";String endX2 = "2020/03/15 00:00:00";System.err.println("最大值之后["+startX2+","+endX2+"]:"+isNormal(startX2, endX2, originList));String startX3 = "2020/01/01 00:00:00";String endX3 = "2020/01/31 24:00:00";System.err.println("中间段["+startX3+","+endX3+"]:"+isNormal(startX3, endX3, originList));String startX4 = "2020/01/01 00:00:00";String endX4 = "2020/03/15 24:00:00";System.err.println("交叉段["+startX4+","+endX4+"]:"+isNormal(startX4, endX4, originList));}}
下面是几个典型样例的测试结果(true表示不重叠)