适用场景:业务中不乏会添加各种各样的定时任务。添加了一个定时任务后,该定时任务可能是每天执行、每周执行或者是每月执行。无论是每天、每周、每月,本质都是在某一刻去操作某一个时间段的数据。那么现在想查看该任务在本批次想要操作的数据,就得计算出本批次的时间段。

注:本批次时间段(起始时间:任务上一次触发的时刻;结束时间:任务下一次执行的时间。)

任务包含的时间参数

clearCycle:执行周期(每天、每周、每月)

clearDay选择执行日期(每周第几天-weekDay、每月第几天-monthDay)

clearCycleDate选择执行时间(HH:mm:ss)

算法逻辑:

1、首先获取当前时间(yyyy-MM-dd HH:mm:ss)。

2、从当前时间中剥离当前的年、月、日、时、分、秒。

3、然后获取任务执行时间clearCycleDate(HH:mm:ss),拼接当前年、月、日。将时间格式化成(yyyy-MM-dd HH:mm:ss)

4、获取任务执行周期clearCycle(每天、每周、每月)。

5、根据任务执行周期clearDay。

6、根据当前时间与真实的任务执行时间(clearCycle--clearDay--clearCycleDate)作比较。根据时间偏移量计算出该任务下一次执行时间。

7、计算出下一次执行时间后,将该时间向前偏移一个执行周期(clearCycle)即可计算出任务上一次执行时间。

java代码实现如下:

/* 本批次清理数据的开始时间与结束时间 */
Date startDate = null;
Date endDate = null;
String clearDate = task.getClearCycleDate();//清理时间 HH:mm:ss
int clearDay;//每周第几天或每月第几天
Calendar calendar = Calendar.getInstance();
//当前日期字符串,格式:yyyy-MM-dd
String today= DateUtil.today();
String nowClearDate = today+" "+clearDate;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//计算清理的真实时间
Date realClearDate = new Date();
try {realClearDate = format.parse(nowClearDate);
} catch (ParseException e1) {e1.printStackTrace();
}
switch (task.getClearCycle()) {case "DAY":Date date = new Date();if(date.compareTo(realClearDate) > 0) {startDate = realClearDate;}else {startDate = DateUtil.offsetDay(realClearDate, -1);}endDate = DateUtil.offsetDay(startDate, 1);break;case "WEEK":clearDay = Integer.parseInt(task.getClearDay());//每周第几天int[] week = {7,1,2,3,4,5,6};int week_day = week[calendar.get(Calendar.DAY_OF_WEEK)-1];if(week_day>=clearDay) {//向前偏移到上一次清理时间startDate = DateUtil.offsetDay(realClearDate, clearDay-week_day);}else {//先向后偏移到下一次清理时间,然后再向前偏移一周就是本批次起始时间startDate = DateUtil.offsetDay(realClearDate, clearDay-week_day);startDate = DateUtil.offsetDay(startDate, -7);}endDate = DateUtil.offsetDay(startDate, 7);break;case "MONTH":clearDay = Integer.parseInt(task.getClearDay());//每月第几天int month_day = calendar.get(Calendar.DAY_OF_MONTH);if(month_day>=clearDay) {//向前偏移到上一次清理时间startDate = DateUtil.offsetDay(realClearDate, clearDay-month_day);}else {//先向后偏移到下一次清理时间,然后再向前偏移一个月就是本批次起始时间startDate = DateUtil.offsetDay(startDate, clearDay-month_day);startDate = DateUtil.offsetMonth(startDate, -1);}endDate = DateUtil.offsetMonth(startDate, 1);break;default:break;
}

关于定时任务一个批次起止时间的算法设计与实现相关推荐

  1. hutool的定时任务不支持依赖注入怎么办_设计一个任务调度算法,时间轮算法,比优先队列更高效...

    当年我还是个学生的时候,有一次去参加欢聚时代的一个面试,有一道面试题记忆尤新,让你来实现一个定时任务,你会怎么做?为了简化问题,我们只用考虑内存方案,不用考虑数据持久化. 数组法 最简单的,我们可以把 ...

  2. 从 Kafka 看时间轮算法设计

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:https://juejin.cn/post/7047405443961847816 前言 Kafka 中有很多延时操作,比如 ...

  3. 孙玄辜教授:基于Linux内核的时间轮算法设计实现【附代码】

    文章目录 1.时间轮算法基本思想 2.定时器的添加 3.定时器到期处理 孙玄:毕业于浙江大学,现任转转公司首席架构师,技术委员会主席,大中后台技术负责人(交易平台.基础服务.智能客服.基础架构.智能运 ...

  4. 以空间换时间——动态规划算法及其应用:矩阵链相乘

    动态规划算法是5大算法基础中最重要的一个,它专门用来解决平面世界下的应用,即会多次使用二维数组. 当然动态规划算法是空间换时间的算法,也就是说:我们可以利用空间资源来使某算法问题的时间复杂度降到最低. ...

  5. 「Python|场景案例」如何获取音视频中声音片段的起止时间?

    本文主要介绍如何使用python的第三方库moviepy找出音视频中声音开始出现的位置以及声音结束的位置. 文章目录 场景描述 准备工作 解决方案 源代码 场景描述 假设我们有一段音频,音频开始有一段 ...

  6. PHP获取本周的起止时间

    PHP获取本周的起止时间 /* 这里首先判断是不是周一,date('w')如果为0代表星期日,1就代表星期一,如果是的话获取周一的unix时间戳(从某个时间点到现在的秒数) 如果不是周一,那么就获取最 ...

  7. PHP实现周和月起止时间计算方法

    当前周的起止时间计算 当前月的起止时间计算 当前周往后的指定周数的起止时间 指定月的每周的起止日期 当前周的起止时间计算 public function getWeekend(){$date=date ...

  8. uni-app 超好用的时间选择器组件(起止时间)

    uni-app 超好用的时间选择器组件(起止时间) uni-app 时间组件 选择开始时间和结束时间 可以单填一个 也可以不填 时间组件效果图 1. 引入插件 点击进入下载页面 2. 根据步骤引入到项 ...

  9. 解决bug 起止时间相同 搜索不到相关数据

    一.背景: 同事写了一个搜索功能,由于某些原因去了其他项目组,测试测出来他遗留下来的一个bug,领导把这个bug给了我让我解决. 二.目的: 解决起止时间相同, 搜索不到相关数据,并记录这个bug问题 ...

最新文章

  1. python调用c++总结
  2. 16进制颜色透明_PPT | 如何快速提取图片颜色之人生太卷
  3. Redis学习总结(12)——Redis常见面试题再总结
  4. 【Java】对象容器——集合
  5. linxu命令个人使用总结
  6. 使用webbench进行压力测试
  7. 南航计算机专业哪个校区,今天被南航拟录取了,写点干货留给后来人(学校选择+初试+复试)...
  8. 职场动物进化手册-读后感
  9. numpy不对等切分数组
  10. 傅盛:认知升级三部曲(深度好文)
  11. [日常] [Python] 批量将某个文件夹下的.ppt/.pptx/.pptm转换为.pdf文件,并且将其移入/ppt文件夹中
  12. Google GMS认证测试几个名词
  13. 目标跟踪论文(一):SiamFC孪生网络
  14. UT-Exynos4412开发板三星ARM四核旗舰开发平台android4.0体验-11有线网络功能调试
  15. 冲鸭!羊毛薅起来!当当618专享不到4折,Python书籍囤起来!
  16. 计算机第一性原理局限性,第一性原理分子动力学
  17. 如何使用winrar制作一个安装包
  18. 应用商店无法进行下载
  19. [转][荐]小菜编程成长记系列
  20. 超级简历-前端实习面试

热门文章

  1. 【JavaScript】时间日期,月日小于10的前面补0(新方法padStart)
  2. For循环语句及使用
  3. python将一个字符串反转并输出_逆转字符串—输入一个字符串,将其逆转并输出。...
  4. 输入一个字符串,将字符串中的大写字母改成小写字母,小写字母不变,其他字符忽略,然后输出转换之后的结果。
  5. scapy:网络数据包操作
  6. 微信小程序获取当前系统时间以及判断周几
  7. 中国程序员最容易发错的单词
  8. 机器学习 网站大全--陆续更新中
  9. Win7下硬盘响声大的解决办法
  10. Mac下压缩和解压rar文件的方法