日期:2014-05-20  浏览次数:20898 次

java 求时间段补集
想实现如下需求:
    定义一个完整时间段:2012-12-29 08:00:00至2012-12-29 20:59:59

    定义若干个被占用的时间段如:
    时间段1:2012-12-29 09:00:00 至 2012-12-29 10:30:00   
    时间段2:2012-12-29 15:00:00 至 2012-12-29 17:00:00

    在完整时间段基础上需求出剔除时间段1,2(已经被占用)的空闲时间段

------解决方案--------------------
这个也不是很复杂,实际生活中的判断会议室的占用情况就是这样的
做一下交集和差集就可以得出结果了,自己先想下吧,有时间的话,可以考虑实现下
------解决方案--------------------
这种可能需要自己写吧,刚写了个,试试能不能用嘛


package com.study.test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class T {

public static void main(String[] args) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date defStart = sdf.parse("2012-12-29 08:00:00");
Date defEnd = sdf.parse("2012-12-29 20:59:59");
Date start1 = sdf.parse("2012-12-29 08:00:00");
Date end1 = sdf.parse("2012-12-29 10:30:00");   
Date start2 = sdf.parse("2012-12-29 15:00:00");
Date end2 = sdf.parse("2012-12-29 17:00:00");
    
List<Date[]> defDates = new ArrayList<Date[]>();
List<Date[]> dates = new ArrayList<Date[]>();
defDates.add(new Date[]{defStart, defEnd});
dates.add(new Date[]{start1, end1});
dates.add(new Date[]{start2, end2});
getFreeTimes(defDates, dates);
for(Date[] date : defDates){
System.out.println(sdf.format(date[0]) + "--" + sdf.format(date[1]));
}
}

public static void getFreeTimes(List<Date[]> defDates, List<Date[]> dates){
for(Date[] date : dates){
dateFilter(defDates);
for(int i = 0; i < defDates.size(); i++){
Date[] defDate = defDates.get(i);
Date[][] d = getFreeTimes(defDate, date);
if(d != null){
defDates.remove(defDate);
i--;
if(d.length >= 1){
defDates.add(d[0]);
}
if(d.length == 2){
defDates.add(d[1]);
}
}
}
}
}

private static void dateFilter(List<Date[]> dates){
if(dates != null){
for(int i = 0; i < dates.size(); i++){
Date[] date = dates.get(i);
if(date[0].getTime() == date[1].getTime()){
dates.remove(i);
i--;
}
}
}
}

private static Date[][] getFreeTimes(Date[] defDate, Date[] date){
Date[][] dates = new Date[2][2];
if(defDate != null && defDate.length == 2 && date != null && date.length == 2){
long defStartTime = defDate[0].getTime();
long defEndTime = defDate[1].getTime();
long startTime = date[0].getTime();