cron表达式是使用任务调度经常使用的表达式了。对于通常的简单任务,我们只需要一条cron表达式就能满足。但是有的时候任务也可以很复杂。

最近我遇到了一个问题,一条任务在开始的时候要触发A方法,在结束的时候需要触发B方法。所以每次我添加触发器的时候都需要两个cron表达式,两个表达式需要间隔一定的时间。听起来特别复杂,但是实际上我只需要实现每天、每周、每月的时间就可以了。

选择每天时,持续时间不超过一天。

选择每周时,持续时间不超过一周。

选择每月时,持续时间不超过30天。

public class cronExpressionAddDuration {
public static void main(String[] args) {
/* {"cron":"0 0 0 31 * ?","duration":2678400}*/
/* {"cron":"0 20 0 ? * 7","duration":604740}*/
/* {"cron":"0 20 0 * * ?","duration":86340}*/
/* {"cron":"0 59 23 L * ?","duration":2678340} */
String cron="cron\":\"0 59 23 L * ?";
int duration=2678340;
String newCron=cronExpressionPlusDuration(cron,duration);
System.out.println(newCron);
}
/**
* <p>对cron表达式进行修改,根据传入的时间生成一个新的cron表达式</>
* 两个表达式之间的间隔为duration
*
* @param cron
* @param duration 单位为秒
* @return
*/
private static String cronExpressionPlusDuration(String cron, int duration) { String[] cronArray = cron.split(" ");
int days = duration / 86400;
int hours = (duration % (86400)) / 3600;
int minutes = ((duration % (86400)) % 3600) / 60;
cronArray[2] = String.valueOf(Integer.valueOf(cronArray[2]) + hours);
cronArray[1] = String.valueOf(Integer.valueOf(cronArray[1]) + minutes);
/* 对小时和分钟进行合法性校验*/
if (Integer.valueOf(cronArray[1]) >= 60 || Integer.valueOf(cronArray[2]) >= 24) {
int extraMinutes = Integer.valueOf(cronArray[1]) % 60;
int extraHours = (Integer.valueOf(cronArray[2])+ Integer.valueOf(cronArray[1]) / 60)%24;
cronArray[2] = String.valueOf(extraHours);
cronArray[1] = String.valueOf(extraMinutes);
}
/* 持续时间一天以内*/
if (duration < 86400 && "*".equals(cronArray[3]) && "*".equals(cronArray[4]) && "?".equals(cronArray[5])) { } else if (duration > 86400 && duration < 86400 * 7) {
cronArray[5] = String.valueOf((Integer.valueOf(cronArray[5]) + days) % 7 + 1);
} else if (duration > 86400 * 7 && duration < 86400 * 32) {
if("L".equals(cronArray[3])){
cronArray[3]=String.valueOf(days);
}else {
cronArray[3] = String.valueOf(((Integer.valueOf(cronArray[3]) + days) % 31) + 1);
}
}
String result = "";
for (String s : cronArray) {
result += s + " ";
}
return result;
}
}

代码写完了,但是这个方法有个缺陷。

  1. 如果期望添加一个暂停方式是每月且持续时间超过28天的表达式,那么在二月份该表达式不会生效。
  2. 如果期望添加一个暂停方式是每月的表达式,例如每月最后一天00:00持续时间5天。

    假如我在3号添加了这条规则,如果此时该任务还有一个规则是5号不应该恢复,理论上我们不希望再次触发。但实际上此时这条规则会在5号触发。

按时间间隔生成cron表达式的更多相关文章

  1. java生成cron表达式

    bean类: package com.cst.klocwork.service.cron; public class TaskScheduleModel { /** * 所选作业类型: * 1 -&g ...

  2. 指定时间生成cron表达式

    public class CronUtils { private static final SimpleDateFormat sdf = new SimpleDateFormat("ss m ...

  3. quartz cron表达式在线生成

    近期使用了quartz定时器,有感于起cron表达式有点复杂.且无法实时推断定时时间是否正确,因此写了个在线表达式及依据表达式获得前10次运行时间. 訪问地址例如以下:http://cron.g2ro ...

  4. quartz.net 时间表达式----- Cron表达式详解

    序言 Cron表达式:就是用简单的xxoo符号按照一定的规则,就能把各种时间维度表达的淋漓尽致,无所不在其中,然后在用来做任务调度(定时服务)的quart.net中所认知执行,可想而知这是多么的天衣无 ...

  5. 通过Quartz 配置定时调度任务:使用cron表达式配置时间点

    Cron官网入口 在后台经常需要一些定时处理的任务,比如微信相关应用所需的access_token,就要定时刷新,官方返回的有效性是7200s,也就是2小时,但是为了保险起见,除了在发现access_ ...

  6. Quartz Cron表达式的二三事

    最近在解决产品上的一个需求,就是定期生成报告(Report),我们叫做Scheduled Report. 原理:UI获取用户输入的时间信息,后台使用Spring框架设置定时任务,这里定时任务用的就是  ...

  7. 详解定时任务中的 cron 表达式

    1.前言 我们经常使用 cron 表达式来定义定时任务的执行策略,今天我们就总结一下 cron 表达式的一些相关知识. 2. cron 表达式的定义 cron 表达式是一个字符串,该字符串由 6 个空 ...

  8. 使用Cron表达式创建定时任务

    CronTriggerCronTrigger功能非常强大,是基于日历的作业调度,而SimpleTrigger是精准指定间隔,所以相比SimpleTrigger,CroTrigger更加常用.CroTr ...

  9. quartz Cron表达式生成详解

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

随机推荐

  1. AIX 7命令行weblogic建域流水

    $ ./config.shUnable to instantiate GUI, defaulting to console mode. <------------------- Fusion M ...

  2. 学习计划 mysql desc表结构分析

    在完成数据表建表后,我们需要知道我们的表结构是什么,有没有和构造表时差异的地方. -- 简单查看表结构 desc 表名 这里拿数据库的一张表中做示例 mysql> desc rental; +- ...

  3. LoadRunner-录制脚本中文显示乱码

    录制的脚本中中文字符显示乱码 在Tools->Recording Options中设置支持UTF-8即可

  4. SVN版本控制系统搭建(结合http服务)

    SVN版本控制服务器搭建 Svn(subversion)是一个开源代码管理的控制系统,用来管理和存储开发的源代码,基于C/S模式.可以单独提供服务,也可以结合http服务来实现. 运行方式  运行端口 ...

  5. 把web项目部署到阿里云linux服务器上

    最近弄了个试用阿里云服务器倒腾了半天终于部署好,分享一下. 1.登入阿里云打开你申请的是云服务器的实例: 点击重置密码---重置密码后重启服务器才能生效(一般需要重置密码.这里设置的密码是使用xhel ...

  6. JAVA队列的使用

    JAVA队列的使用 今天跟大家来看看如何在项目中使用队列.首先我们要知道使用队列的目的是什么?一般情况下,如果是一些及时消息的处理,并且处理时间很短的情况下是不需要使用队列的,直接阻塞式的方法调用就可 ...

  7. 解决idea工具下tomcat中文乱码问题

    在运行/调试 配置对话框的Startup/Connection面板中, 勾选Pass environment variables. 并添加一个environment variable, Name填 J ...

  8. SeaJS 与 RequireJS 的差异对比

    这篇文章主要介绍了SeaJS 与 RequireJS 的差异对比,本文主要对CMD规范和AMD规范的弊端做了对比,并做出了一个总结,需要的朋友可以参考下 “历史不是过去,历史正在上演.随着 W3C 等 ...

  9. [kx]宇宙-银河

    行星/恒星/卫星的区分 目前太阳系内有8颗行星,分别是:水星.金星.地球.火星.木星.土星.天王星.海王星. 参考 恒星是自发光,而行星(行星通常指自身不发光,其公转方向常与所绕恒星的自转方向相同.) ...

  10. http协议基础(七)通用首部字段

    通用首部字段的意思,就是:请求和响应报文双方都会使用的首部 1.Cache-Control 通过指定它的指令,能操作缓存的工作机制 指令参数是可选的,多个指令通过“,”分隔 Cache-Control ...