cron表达式详解

时间:2019-05-06
本文章向大家介绍cron表达式详解,主要包括cron表达式详解使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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

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

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

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

每个域的释义及取值

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

Field Name Mandatory Allowed Values Allowed Special Characters
Seconds YES 0-59 , - * /
Minutes YES 0-59 , - * /
Hours YES 0-23 , - * /
Day of month YES 1-31 , - * ? / L W
Month YES 1-12 or JAN-DEC , - * /
Day of week YES 1-7 or SUN-SAT , - * ? / L #
Year NO empty, 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. 如果其中一个是*,另外一个也得是?**(存疑)
    合法的表达式:
    * * 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