/**
* 将指定的时间段,减去多个指定的已用的时间段,最终返回有效的时间段
* 整体思路就是将所有时间打散,变成集合,然后求指定时间段的补集,最终将结果中连续的时间放到一起,返回开始结束时间的列表
* @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
// 分割日期字符串 var arrDate = start.split('-'); var objDate1 = new Date(arrDate[1] + '-' + arrDate[2] + '-' + arrDate[0]); arrDate = end.split('-'); var objDate2 = new Date(arrDate[1] + '-' + ...
- **实现方法**: 通过`cut`命令分割日期字符串,计算出年月日,并根据这些信息计算出上一个月的最后一天。 ##### 2. `getWeekDay` 此函数用于获取指定日期是一周中的哪一天。 ```bash getWeekDay() { str=$1 year...
自定义时间与日期选择器中标题颜色,字号,以及数字选择器的分割线颜色.以达到不同系统版本统一样式. 备注: 在类AnalogDigitalClock中第246行 android4.2.2系统及以下为 LinearLayout llSecond = (LinearLayout) ...
[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]下面是用数组+正则替换实现的代码 [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]“hand hand hand”想变换为”hand.gif hand.gif hand.gif” 开始用 str=str....
React Split Date Input 是一个基于React的可重用组件,它为用户提供了一种方便的方式来输入日期,将日期的年、月、日部分分开显示,从而提高输入的清晰度和准确性。这个组件采用MIT许可证,允许自由使用、修改和...
已经封装好,把log4j.appender.fileout=org.apache.log4j.Log4JDateAndSizeSplit 即可,其余和原api一样: log4j.appender.fileout.MaxFileSize=10240KB log4j.appender.fileout.MaxBackupIndex=20
在KSII事务码中,用户可以输入费用分割信息,包括分割日期、分割金额、分割原因等信息,并对费用分割进行审核和批准。 生产性成本中心实际作业价格计算 -------------------------------- 生产性成本中心实际作业...
例如,要将这个字符串转换为TDateTime,我们可以先分割日期和时间,然后分别转换: ```delphi var DatePart, TimePart: string; DateTimeValue: TDateTime; begin DatePart := '20110818'; // 假设这是从输入...
10. REFDATE函数:REFDATE函数是一个日期引用函数,用于引用指定日期的数据。在本文档中,REFDATE函数用于绘制黄金分割线的分割点。 11. DRAWTEXT函数:DRAWTEXT函数是一个绘图函数,用于绘制文字。在本文档中,...
《日志分割工具在Windows环境下的应用与实践》 在信息技术领域,日志管理是系统监控、故障排查和性能分析的重要环节。大量的日志数据往往会导致单个文件体积过大,不利于存储、传输和分析。因此,日志分割工具...
3. 自定义条件分割:用户可以设置特定条件,如达到某个特定值或日期,作为分割点。 4. 保留原始格式:分割后的子文件应保持与原文件相同的列格式和公式,以便于数据的连续处理。 5. 批量处理:工具可能支持一次性...
一个简单的方式是使用两个日期对象,分别表示时间段的开始和结束。例如: ```javascript function TimeSegment(start, end) { this.start = start; this.end = end; } ``` 接下来,我们需要一个函数来检查两个...
此外,还可以选择是否保留原始文件的元数据,如作者、创建日期等信息。 确认设置无误后,点击“开始”按钮,软件会迅速执行分割操作,进度条会显示处理状态。完成之后,会在指定的输出目录下生成分割后的PDF文件,...
3. 使用`copy`或`type`和`>`重定向符号将旧日志分割成新的日志文件,例如创建新的日志文件并把当天日期之后的内容写入新文件。 4. 可能还会包含清理旧日志的步骤,如删除超过一定天数的日志,以保持存储空间的合理...
捐款日期 2012-07-17 相关的任务: 分类 遗漏值的吗? N / A Number of Web Hits: 十二万七千六百九十九 来源 该rajen Bhatt,迪豪;rajen.bhatt'@'gmail.com, IIT Delhi. Data Set Information...
本文将详细介绍如何在Windows环境下,通过简单的配置使Tomcat的日志文件`catalina.out`能够按照日期进行自动分割。 #### 二、准备工作 在开始配置之前,需要确保已经安装了Tomcat,并且它能正常运行。此外,还需要...
Python中关于时间、日期的处理库有三个:time、datetime和Calendar,其中datetime又有datetime.date、datetime.time、datetime.datetime三个类。而时间又可以分为时间戳、本地时间和UTC时间(世界标准时间)。是不是...