场景:数据库一张表,有个startcron 和endcron 两个字段,根据表达式计算今天的所有时间段。

例:startcron :0 30 20 ? * * endcron :0 30 21 ? * *,现在时间20:19 所以得到的时间是20:30~21:30

由于有多个数据,

0 0 9 ? * *       0 0 10 ? * * 
 0 30 20 ? * *   0 30 20 ? * * 
 0 0 21 ? * *     0 0 22 ? * * 
 0 30 20 ? * *   0 30 22 ? * * 等

Map<Date,Date> map = new HashMap<>();

Set<Date> set = map.keySet();
Date[] dateArray = new Date[set.size()];
set.toArray(dateArray);
if(set.size()==0){
map.put(starttime, endtime);
}else{
boolean flag = true;
for(int j =0;j<dateArray.length;j++){
if(flag){
Date date= dateArray[j];

if(!(map.get(date).beforestarttime) || date.after(endtime))){
Date minDate = date.before(starttime)?date:starttime;
Date maxDate = map.get(date).after(endtime)?map.get(date):endtime;
map.remove(date);
map.put(minDate, maxDate);
flag = false;
}
}
}
if(flag){
map.put(starttime, endtime);
}
}

主要思路: 两个时段 A-B          C-D

map,key放startime  value放endtime

判断只要相交,if(!(map.get(date).before(starttime) || date.after(endtime)))

就取四个时间的最大值和最小值,Date minDate = date.before(starttime)?date:starttime;
               Date maxDate = map.get(date).after(endtime)?map.get(date):endtime;

先移除map中原来的,map.remove(date);

再放入最大值和最小值 map.put(minDate, maxDate);

设置了一个flag,初始值为true,只要有交换就改变flag,,遍历map,若flag为true,代表没有合并,就表示该时段独立的。map.put(starttime, endtime);

根据多个成对的cron表达式生成的时间段,合并的更多相关文章

  1. quartz Cron表达式生成详解

    简介 Cron作为一个Unix工具,已经存在很长一段时间了,用于实现任务调度的功能.CronTrigger类基于Cron而来. CronTrigger CronTriggers往往比SimpleTri ...

  2. 在线cron表达式生成工具

    http://cron.qqe2.com/ 名称 是否必须 允许值 特殊字符 秒 是 0-59 , - * / 分 是 0-59 , - * / 时 是 0-23 , - * / 日 是 1-31 , ...

  3. 定时任务 Cron表达式

    Cron表达式由6~7项组成,中间用空格分开.从左到右依次是: 秒.分.时.日.月.周几.年(可省略) Cron表达式的值可以是数字,也可以是以下符号: "*":所有值都匹配 &q ...

  4. [quartz] - Cron表达式举例

    Quartz是一个任务调度框架.比如你遇到这样的问题 想每月25号,信用卡自动还款 想每年2月14日自己给当年暗恋女神发一封匿名贺卡 想每隔1小时,备份一下自己的SpringCloud学习笔记到云盘 ...

  5. quartz定时任务cron表达式讲解及翻译成现实语言的插件的使用详解

    cron表达式讲解 参见该网址: https://www.cnblogs.com/GarfieldTom/p/3746290.html cron表达式只有专业技术人员才看得懂,普通人不知道表达式是什么 ...

  6. Cron表达式简单学习

    CronTriggers往往比SimpleTrigger更有用,如果您需要基于日历的概念,而非SimpleTrigger完全指定的时间间隔,复发的发射工作的时间表.CronTrigger,你可以指定触 ...

  7. Cron表达式说明

    CronTrigger CronTriggers往往比SimpleTrigger更有用,如果您需要基于日历的概念,而非SimpleTrigger完全指定的时间间隔,复发的发射工作的时间表. CronT ...

  8. QuartZ Cron表达式在java定时框架中的应用

    CronTrigger CronTriggers往往比SimpleTrigger更有用,如果您需要基于日历的概念,而非SimpleTrigger完全指定的时间间隔,复发的发射工作的时间表. CronT ...

  9. quartz Cron表达式一分钟教程

    CronTrigger CronTriggers往往比SimpleTrigger更有用,如果您需要基于日历的概念,而非SimpleTrigger完全指定的时间间隔,复发的发射工作的时间表.CronTr ...

随机推荐

  1. 短视频处理LanSoEditor-SDK之功能介绍

    短视频处理LanSoEditor-SDK之功能介绍  (注释: 我们的SDK每3周更新一次, 一下功能是在2.8.2版本上列出的,可能不是最新的功能, 请知悉) 和别家最大的不同在于: 别人提供功能, ...

  2. .net core 3.0 Signalr - 02 使用强类型的Hub

    ## 强类型的优缺点 - 优点 强类型的Hub可以避免魔法函数名,相比弱类型更容易维护和发现问题,直接上代码 - 缺点 特么的得多些好几行代码 ## 代码 ### 接口定义 ``` C# /// // ...

  3. 证明xcosx无周期

    假设\(xcos\,x\)有周期,依据周期函数的规律,可得 \[ \begin{aligned} xcos\,x & = (x+T)cos\,(x+T) \\ & = (x+T)cos ...

  4. Go标准库Context

    在 Go http包的Server中,每一个请求在都有一个对应的 goroutine 去处理.请求处理函数通常会启动额外的 goroutine 用来访问后端服务,比如数据库和RPC服务.用来处理一个请 ...

  5. else块的用途

    除了在if...else...中使用,else块还可以在for循环.while循环以及try...except中使用. 在for循环中使用: my_list = ['a','b','c','d'] f ...

  6. 记一次共享内存/dev/shm 小于memory_target 引发的客户DB 宕机问题

    1> 记一次共享内存/dev/shm 小于memory_target 引发的客户DB 宕机问题(处理心得)

  7. 数据表管理admin

    知识预览 admin组件使用 admin源码解析 回到顶部 admin组件使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你 ...

  8. python编程基础之十三

    列表的通用操作: list1 = [43, 65, 76, 6] list2 = [45, 77, 90, 11, 2, 4, 66] print(list1+ list2)  # 列表组合 prin ...

  9. SQL SERVER数据库三种数据插入方式

    数据插入:INSERT INTO A(CBM,CMC) VALUES('1','测试')--单条数据插入INSERT INTO A(CBM,CMC)SELECT '1','测试'--单条数据插入INS ...

  10. MySQL优化与实践

    一.MySQL优化概括 二.SQL优化 实践: 1.查看是否开启了慢查询日志 show variables like 'slow_query_log' 没有开启 2.查看是否开启了未使用索引SQL记录 ...