java 获取时间区间

package com.javaCode.package05;
import java.text.*;
import java.util.*;
public class Sd123 {
static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) throws Exception {
MyDate m = new MyDate();
m.setStartDate("2012-12-29 08:00:00");
m.setEndDate("2012-12-29 20:59:59");
MyDate m1 = new MyDate();
m1.setStartDate("2012-12-29 09:00:00");
m1.setEndDate("2012-12-29 10:30:00 ");
MyDate m2 = new MyDate();
m2.setStartDate("2012-12-29 15:00:00");
m2.setEndDate("2012-12-29 17:00:00");
List<MyDate> list = new ArrayList<MyDate>();
list.add(m1);
list.add(m2);
List<MyDate> result = getFreeTime(m, list);
for (MyDate d : result) {
System.out.println(d.getStartDate().toString() + " ~ " + d.getEndDate().toString());
}
System.exit(0);
}
private static List<MyDate> getFreeTime(MyDate m, List<MyDate> busy)
throws Exception {
// m 得到时间  busy 得到list 的值
long start = sdf.parse(m.getStartDate()).getTime() / 1000L;
long end = sdf.parse(m.getEndDate()).getTime() / 1000L;
// 取得start---end之间的所以值 赋值给all
Set<Long> all = new TreeSet<Long>();
for (long i = start; i <= end; i++) {
all.add(i);
}
// 取得 busy 中 list 里的值  这里使用set进行去重
Set<Long> busySet = new TreeSet<Long>();
for (MyDate my : busy) {
long s = sdf.parse(my.getStartDate()).getTime() / 1000L;
long e = sdf.parse(my.getEndDate()).getTime() / 1000L;
for (long i = s; i <= e; i++) {
busySet.add(i);
}
}
/*
*  移除 set 中那些包含在指定 collection 中的元素(可选操作)。
*  例如:set1.removeAll(set2)
*   可以删除set1里面和set2重复的所有参数
*  如果你需要一个合集,可以简单那的
*   set1.addAll(set2); 这样set1里面就是所有的参数了。
*/
all.removeAll(busySet);
// free = all 赋值
List<Long> free = new ArrayList<Long>(all);
List<MyDate> result = new ArrayList<MyDate>();
MyDate mm = new MyDate();
for (int i = 0; i < free.size(); i++) {
// 获取free中的 值
long c = free.get(i);
if (i == 0) {
mm.setStartDate(sdf.format(new Date(c * 1000)));
}
if (i == free.size() - 1) {
mm.setEndDate(sdf.format(new Date(c * 1000)));
result.add(mm);
break;
}
long n = free.get(i + 1);
if (n > c + 1) {
mm.setEndDate(sdf.format(new Date(c * 1000)));
result.add(mm);
mm = new MyDate();
mm.setStartDate(sdf.format(new Date(n * 1000)));
}
}
return result;
}
}
class MyDate {
String startDate;
String endDate;
public String getEndDate() {
return endDate;
}
public void setEndDate(String endDate) {
this.endDate = endDate;
}
public String getStartDate() {
return startDate;
}
public void setStartDate(String startDate) {
this.startDate = startDate;
}
}
原文地址:https://www.cnblogs.com/love-you-girl/p/3967876.html