/**
* 将指定的时间段,减去多个指定的已用的时间段,最终返回有效的时间段
* 整体思路就是将所有时间打散,变成集合,然后求指定时间段的补集,最终将结果中连续的时间放到一起,返回开始结束时间的列表
* @param startDay 指定时间段的开始时间 比如1月1日
* @param endDay 指定时间段的结束时间 比如1月30日
* @param usedDay 指定的已用的时间段 比如[1-3到1-6],[1-18到1-20],[1-25到2-6]
* @return 返回[1-1到1-2],[1-7到1-17],[1-21到2-24]
*/
public static List<Date[]> splitDay(Date startDay, Date endDay, List<Date[]> usedDay){
List<Date[]> availableIntervals = new ArrayList<>();
LocalDate startDateA = dateToLocalDate(startDay);
LocalDate endDateA = dateToLocalDate(endDay);
Set<LocalDate[]> dateRangesB = new HashSet<>();
for (Date[] interval : usedDay) {
dateRangesB.add(new LocalDate[]{dateToLocalDate(interval[0]),dateToLocalDate(interval[1])});
}
Set<LocalDate> dateSetA = new HashSet<>();
for (LocalDate date = startDateA; !date.isAfter(endDateA); date = date.plusDays(1)) {
dateSetA.add(date);
}
Set<LocalDate> dateSetB = new HashSet<>();
for (LocalDate[] dateRange : dateRangesB) {
for (LocalDate date = dateRange[0]; !date.isAfter(dateRange[1]); date = date.plusDays(1)) {
dateSetB.add(date);
}
}
// 计算补集
Set<LocalDate> complementSet = new TreeSet<>(dateSetA);
complementSet.removeAll(dateSetB);
// 合并连续时间段
LocalDate start = null;
LocalDate end = null;
for (LocalDate date : complementSet) {
if (start == null) {
start = date;
end = date;
} else if (date.isEqual(end.plusDays(1))) {
end = date;
} else {
availableIntervals.add(new Date[]{localDateToDate(start),localDateToDate(end)});
start = date;
end = date;
}
}
if (start != null && end != null) {
availableIntervals.add(new Date[]{localDateToDate(start),localDateToDate(end)});
}
return availableIntervals;
}
分享到:
相关推荐
php实现通过两个日期如"2018-5-1"、"2018-6-1",输出两个日期段的每一天的日期,2018-5-1,2018-5-2————2018-6-1
主要为大家详细介绍了java分割日期时间段代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
NULL 博文链接:https://linian0209.iteye.com/blog/385531
分割日期输入麻省理工学院许可
自定义时间与日期选择器中标题颜色,字号,以及数字选择器的分割线颜色.以达到不同系统版本统一样式. 备注: 在类AnalogDigitalClock中第246行 android4.2.2系统及以下为 LinearLayout llSecond = (LinearLayout) ...
已经封装好,把log4j.appender.fileout=org.apache.log4j.Log4JDateAndSizeSplit 即可,其余和原api一样: log4j.appender.fileout.MaxFileSize=10240KB log4j.appender.fileout.MaxBackupIndex=20
Python中关于时间、日期的处理库有三个:time、datetime和Calendar,其中datetime又有datetime.date、datetime.time、datetime.datetime三个类。而时间又可以分为时间戳、本地时间和UTC时间(世界标准时间)。是不是...
事务处理 游标 c#页面缓存 字符分割 日期转换等
windows下tomcat的catalina.out按天自动分割,windows下tomcat日志按天自动分割
对于多个时间段, 按照他们相交的部分分割成多个时间段
Date.prototype.toArray 日期分割为数组 Date.prototype.DatePart 取日期的部分信息 Date.prototype.MaxDayOfDate 取日期所在月的最大天数 Date.prototype.WeekNumOfYear 判断日期所在年的第几周 StringToDate 字符...
主要介绍了django实现日志按日期分割,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
折线、双Y轴、不交叉、highcharts、按照日期分割线 折线、双Y轴、不交叉、highcharts、按照日期分割线
捐款日期 2012-07-17 相关的任务: 分类 遗漏值的吗? N / A Number of Web Hits: 十二万七千六百九十九 来源 该rajen Bhatt,迪豪;rajen.bhatt'@'gmail.com, IIT Delhi. Data Set Information...
提交日期 引言 数字图像处理技术是一个跨学科的领域。随着计算机科学技术的不断发展,图像处理和分析逐渐形成了自己的科学体系,新的处理方法层出不穷,尽管其发展历史不长,但却引起各方面人士的广泛关注。首先,...
针对linux环境上tomcat不断输出到catalina.out文件的问题,提供一个按天分割catalina.out的脚本,以及操作说明。绝对可用!
WINDOWS下切割LOG工具,中文版,可自定义切割大小,支持WIN10,
Java 对现有的大文件按文件大小或是按生成日期进行分割
Date.prototype.toArray 日期分割为数组 Date.prototype.DatePart 取日期的部分信息 Date.prototype.MaxDayOfDate 取日期所在月的最大天数 Date.prototype.WeekNumOfYear 判断日期所在年的第几周 StringToDate 字符...