求多個日期時間段的並集-java


說一下需求:

​ 多個含有startTime,endTime的時間段,處理后取出並集,最后的格式為yyyy/MM/dd,如果中間有斷,用逗號隔開,例如 2019/06/01-2019/08/01,2019/10/01-2019/10/20

場景准備:

先模擬一個對象,里面存儲startTime,endTime;

@Data
public class MyDate(){
  private Date startTime;
  private Date endTime;
}

放入數據:

這里就模擬一種情況吧,有心的同學可以多試試其他的情況

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
List<MyDate> dateList = new ArratList<MyDate>();

MyDate myDate1 = new MyDate();
myDate1.setStartTime(sdf.parse("2019/08/01"));
myDate1.setEndTime(sdf.parse("2019/09/01"));

MyDate myDate2 = new MyDate();
myDate2.setStartTime(sdf.parse("2019/08/15"));
myDate2.setEndTime(sdf.parse("2019/09/15"));

dateList.add(myDate1);
dateList.add(myDate2);

上面的數據應該是各位都已經有的,我簡單的模擬了出來,現在

正片開始

public String getDateFormat(List<MyDate> dateList){
  //求出多個時間的並集
        HashMap<Date, Date> dateMap = new HashMap<>();
        for (MyDate mydate : dateList) {
            Date startTime = mydate.getStartTime();
            Date endTime = mydate.getEndTime();
            //第一個時間
            if (MapUtils.isEmpty(dateMap)) {
                dateMap.put(startTime, endTime);
            }
            HashMap<Date, Date> tempMap = new HashMap<>();
            Iterator<Map.Entry<Date, Date>> iterator = dateMap.entrySet().iterator();
            while (iterator.hasNext()) {
                Map.Entry<Date, Date> entry = iterator.next();
                Date start1 = entry.getKey();
                Date end1 = entry.getValue();
                if (startTime.after(end1) || endTime.before(start1)) {
                    tempMap.put(startTime, endTime);
                } else if (startTime.before(start1) && endTime.before(end1)) {
                    tempMap.put(startTime, end1);
                    iterator.remove();
                } else if (startTime.before(start1) && endTime.before(end1)) {
                    tempMap.put(startTime, endTime);
                    iterator.remove();
                } else if (startTime.before(end1) && endTime.after(end1)) {
                    tempMap.put(start1, endTime);
                }
            }
            dateMap.putAll(tempMap);
        }
        StringBuilder sb = new StringBuilder();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
        dateMap.forEach((k, v) -> {
            sb.append(sdf.format(k) + "-" + sdf.format(v) + ",");
        });
        return sb.deleteCharAt(sb.length() - 1).toString();
}

代碼寫的匆忙,有很多可以優化的地方,不過基本的功能能實現,有時間再改吧,希望能幫助到各位!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM