一文掌握定时任务的 CRON 表达式

919 阅读3分钟

快速入门

CRON 表达式用于设置「定时任务」的执行周期,用于表达诸如“每小时执行一次”,“每天2点执行一次”,“每月1日2点执行一次”,“每周一0点执行一次”,“每10分钟执行一次”等定时任务。

为了清晰表达时间周期,CRON 定义了7种时间周期:秒、分、时、日期、月、周,通过位置来区分。比如表达式:0 0 2 1 * ? ,有如下对应关系:

而每个时间周期位置上的符号,又指定了在该周期上的循环方式。我们从右到左解读上述配置:

  • 年:*表示每,和时间周期结合,代表了「每年」。

  • 星期:? 表示该周期不生效,直接忽略。

  • 月:含义是「每月」。

  • 日:这里日表示的是在每月中的日期,值为 1 则表示 「1日」。

  • 小时:「2时」

  • 分钟:「0分」

  • 秒:「0秒」

  • 串起来含义就是:每年每月1日2时0分0秒执行一次。通俗一点说,每月1日2:00执行一次。

到这里相信你已经可以理解 CRON 表达式的作用和基本原理了。可以看出,CRON 表达式的关键在于「时间周期」和「符号」。为了掌握更多用法,只需了解所有的「时间周期」和「符号」的用法。请看《深入细节》部分:

深入细节

时间周期

CRON 表达式有多种长度的:5 位、6 位、7位

位数含义
5位:* * * * *分、时、日期、月、周
6位:* * * * * *秒、分、时、日期、月、周
7位:* * * * * * *秒、分、时、日期、月、周、年

符号

重点符号

以下符号在每个时间周期上都可以使用,掌握这些就能理解绝大部分 CRON 表达式啦!

符号含义举例
*****每的意思。在不同的字段上,就代表每秒,每分,每小时等。" ***** 0 0 1 1 ?":在 1 月 1 日 0: 00 (到 0:01分为止,即满足时间是 0:00 的所有时刻)时间内的每一秒钟执行一次。
-指定值的范围。表示在满足指定的区间执行。"5 * 0-2 * * ?" 从0点到2点,每分钟的第5秒执行一次。
,指定某几个值。"5 * 0,2 * * ?" 在0点和2点,每分钟的第5秒执行一次。
/指定值的起始值和间隔。比如[2/5],在秒字段就是每分钟的第2秒开始,每隔5秒生效一次。"*0 0/5 * ? * " 每5分钟执行一次

次要符号

符号含义举例
?仅用于【日期】和【周】字段。因为在指定某日和周几的时候,这两个值实际上是冲突的,所以需要用。
L即 Last. 常用于【日期】字段,表示每月最后一天。(还能用于【周】字段,表示周日,但是意义不大)0 0 2 L * ? * 表示每月最后一天的 2:00 分执行一次。
W即 workday,表示工作日。用于【日期】字段。LW 表示本月最后一个工作日。2W表示离2号最近的工作日,如2号是周六,则表示周五;如2号是周日,则表示周一。

值的范围

时间周期日期
值的范围0-590-590-231-311-12 或 JAN-DEC0-7 或 SUN-SAT1970-2099

工具/库汇总

工欲善其事必先利其器!CRON 表达式的执行或者语句理解细节比较多,还好现有的轮子都比较完善,如果要在正式场合使用,建议使用成熟的库。

定时任务执行

语句含义翻译

参考资料

简洁明了看懂cron表达式

github.com/bradymholt/…

github.com/bradymholt/…