`
lemonhandsome
  • 浏览: 11837 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

分割日期

 
阅读更多
/**
 * 将指定的时间段,减去多个指定的已用的时间段,最终返回有效的时间段
 * 整体思路就是将所有时间打散,变成集合,然后求指定时间段的补集,最终将结果中连续的时间放到一起,返回开始结束时间的列表
 * @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分割日期段 split_time

    php实现通过两个日期如"2018-5-1"、"2018-6-1",输出两个日期段的每一天的日期,2018-5-1,2018-5-2————2018-6-1

    java分割日期时间段代码

    这篇代码示例展示了如何在Java中分割日期时间段,根据指定的时间间隔(月、日、小时或分钟)生成一系列的日期字符串。这个功能对于需要进行时间跨度分析或者定时任务调度的场景非常有用。 首先,我们看到一个名为`...

    小小程序!日期控制

    NULL 博文链接:https://linian0209.iteye.com/blog/385531

    js计算两个日期相差几周

    // 分割日期字符串 var arrDate = start.split('-'); var objDate1 = new Date(arrDate[1] + '-' + arrDate[2] + '-' + arrDate[0]); arrDate = end.split('-'); var objDate2 = new Date(arrDate[1] + '-' + ...

    shell 计算日期

    - **实现方法**: 通过`cut`命令分割日期字符串,计算出年月日,并根据这些信息计算出上一个月的最后一天。 ##### 2. `getWeekDay` 此函数用于获取指定日期是一周中的哪一天。 ```bash getWeekDay() { str=$1 year...

    android自定义日期/时间选择器标题/分割线/

    自定义时间与日期选择器中标题颜色,字号,以及数字选择器的分割线颜色.以达到不同系统版本统一样式. 备注: 在类AnalogDigitalClock中第246行 android4.2.2系统及以下为 LinearLayout llSecond = (LinearLayout) ...

    js 日期字符串截取分割成单个具体的日期(2009-12-30 13:28:29)

    [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]下面是用数组+正则替换实现的代码 [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]“hand hand hand”想变换为”hand.gif hand.gif hand.gif” 开始用 str=str....

    react-split-date-input:可重用的分割日期输入 React 组件

    React Split Date Input 是一个基于React的可重用组件,它为用户提供了一种方便的方式来输入日期,将日期的年、月、日部分分开显示,从而提高输入的清晰度和准确性。这个组件采用MIT许可证,允许自由使用、修改和...

    log4j 同时按日期和文件大小分割日志

    已经封装好,把log4j.appender.fileout=org.apache.log4j.Log4JDateAndSizeSplit 即可,其余和原api一样: log4j.appender.fileout.MaxFileSize=10240KB log4j.appender.fileout.MaxBackupIndex=20

    SAP项目用户操作手册-CO月结.docx

    在KSII事务码中,用户可以输入费用分割信息,包括分割日期、分割金额、分割原因等信息,并对费用分割进行审核和批准。 生产性成本中心实际作业价格计算 -------------------------------- 生产性成本中心实际作业...

    AAA.rar_cupbpi_时间格式

    例如,要将这个字符串转换为TDateTime,我们可以先分割日期和时间,然后分别转换: ```delphi var DatePart, TimePart: string; DateTimeValue: TDateTime; begin DatePart := '20110818'; // 假设这是从输入...

    黄金分割线主图源码通达信指标公式源码.doc

    10. REFDATE函数:REFDATE函数是一个日期引用函数,用于引用指定日期的数据。在本文档中,REFDATE函数用于绘制黄金分割线的分割点。 11. DRAWTEXT函数:DRAWTEXT函数是一个绘图函数,用于绘制文字。在本文档中,...

    Excel分割工具.rar

    3. 自定义条件分割:用户可以设置特定条件,如达到某个特定值或日期,作为分割点。 4. 保留原始格式:分割后的子文件应保持与原文件相同的列格式和公式,以便于数据的连续处理。 5. 批量处理:工具可能支持一次性...

    javascript时间段分割

    一个简单的方式是使用两个日期对象,分别表示时间段的开始和结束。例如: ```javascript function TimeSegment(start, end) { this.start = start; this.end = end; } ``` 接下来,我们需要一个函数来检查两个...

    日志分割工具,中文版

    《日志分割工具在Windows环境下的应用与实践》 在信息技术领域,日志管理是系统监控、故障排查和性能分析的重要环节。大量的日志数据往往会导致单个文件体积过大,不利于存储、传输和分析。因此,日志分割工具...

    PDF分割合并助手可以快速将pdf文件分割成单页

    此外,还可以选择是否保留原始文件的元数据,如作者、创建日期等信息。 确认设置无误后,点击“开始”按钮,软件会迅速执行分割操作,进度条会显示处理状态。完成之后,会在指定的输出目录下生成分割后的PDF文件,...

    自动分割日志一种方法

    3. 使用`copy`或`type`和`&gt;`重定向符号将旧日志分割成新的日志文件,例如创建新的日志文件并把当天日期之后的内容写入新文件。 4. 可能还会包含清理旧日志的步骤,如删除超过一定天数的日志,以保持存储空间的合理...

    肤色分割数据集

    捐款日期 2012-07-17 相关的任务: 分类 遗漏值的吗? N / A Number of Web Hits: 十二万七千六百九十九 来源 该rajen Bhatt,迪豪;rajen.bhatt&#39;@&#39;gmail.com, IIT Delhi. Data Set Information...

    windows下tomcat的catalina.out按天自动分割

    本文将详细介绍如何在Windows环境下,通过简单的配置使Tomcat的日志文件`catalina.out`能够按照日期进行自动分割。 #### 二、准备工作 在开始配置之前,需要确保已经安装了Tomcat,并且它能正常运行。此外,还需要...

    Python中的日期时间处理详解

    Python中关于时间、日期的处理库有三个:time、datetime和Calendar,其中datetime又有datetime.date、datetime.time、datetime.datetime三个类。而时间又可以分为时间戳、本地时间和UTC时间(世界标准时间)。是不是...

Global site tag (gtag.js) - Google Analytics