cron表达式详解

优秀的在线Cron表达式生成器:https://www.pppet.net/ , 里面也有一些常用符号的解释。

cron表达式应用于java的quartz定时任务框架中,也存在于Linux的crontab服务中,但表达式的语法基本一致,区别在于前者是6或7个域,后者是5~6个域, 最后一个域为年,都可以省略。

表达式解释区别
Java-quartz15 1 * * * ?每小时的第1分钟的第15秒执行一次,即每小时执行一次6个域,从左到右:秒 分钟 小时 天 月 星期
Linux-crontab1 * * * ?每小时的第1分钟执行一次5个域,从左到右:分钟 小时 天 月 星期

即crontab的时间粒度是1分钟,quartz的时间粒度是1秒。

每个域的释义及取值

以java的quartz中的cron表达式为例详细说明。以下表格copy form quartz官方文档:

Field NameMandatoryAllowed ValuesAllowed Special Characters
SecondsYES0-59, - * /
MinutesYES0-59, - * /
HoursYES0-23, - * /
Day of monthYES1-31, - * ? / L W
MonthYES1-12 or JAN-DEC, - * /
Day of weekYES1-7 or SUN-SAT, - * ? / L #
YearNOempty, 1970-2099, - * /

Note:
Day of week,用1-7表示时,1对应表示Sunday,7表示Saturday。第一天是Sunday,最后一天是Saturday。

特殊字符用法

  • ,-*/
    这4个字符在每个域都是通用的,直接举例说明:
    5,30 1 * * * ?在每个小时的第1分钟的第5秒和第30秒执行一次,一小时执行两次;
    0 0-5 14 * * ?从每天下午14:00开始,14:00~14:05之间每分钟执行一次;
    0 1/5 14 * * ?从每天下午14:01开始,每5分钟执行一次(一直到14点结束);
    注意: 上述表达式有?,放在下面解释

  • ?
    从上面表格中看到?只用于天和星期这俩域。因为这俩域一起用的时候会有冲突,
    考虑以下非法表达式:
    * * 14 1 * 2每个月1号的14:00开始,但是又限定星期取2(星期一),如果1号不是星期一,定时任务要不要执行呢?这就存在一种疑问,因此:
    1. Day of monthDay of week使用上有冲突,不可以一起用,用了这俩其中一个,另外一个要用?
    2. 如果其中一个是*,另外一个最好也得是?(但是目前spring和crontab都是支持两个域都为*的情况的)
    合法的表达式:
    * * 14 1 * ?每个月1号的14:00执行一次,每月执行一次;
    * * 14 ? * 2每个月的星期一的14:00执行一次,每个星期执行一次;

  • L
    即last,最后一天:
    0 0 1 L * ?每个月的最后一天的1:00:00执行一次,每月执行一次;
    0 0 1 ? * L每周的最后一天(即每周的周六)的1:00:00执行一次,每周执行一次;

  • W
    即weekday,工作日,从Monday-Friday为工作日
    0 0 1 15W * ?15W,意思是每个月的15号,如果15号是工作日,就15号执行;如果15号是周六或周日,就选离15号最近的工作日,但选择最近不会跨月。此表达式表示一个月执行一次
    另外LW可以连用:
    0 0 1 LW * ?表示每个月的最后一个工作日,一个月执行一次

  • #
    举例
    0 0 1 ? * 6#3表示每个月的第3周的第6天,即每个月的第3周的周五执行一次,一个月执行一次

参考:

  1. Linux crontab: https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/crontab.html
  2. Quatz cron expression: http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值