快速入门
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-59 | 0-59 | 0-23 | 1-31 | 1-12 或 JAN-DEC | 0-7 或 SUN-SAT | 1970-2099 |
工具/库汇总
工欲善其事必先利其器!CRON 表达式的执行或者语句理解细节比较多,还好现有的轮子都比较完善,如果要在正式场合使用,建议使用成熟的库。
定时任务执行
- Go - github.com/robfig/cron
- Ruby - github.com/javan/whene…
- JavaScript - github.com/kelektiv/no…
- PHP - github.com/liebig/cron
- Java - github.com/machanic/Cr…
- C - github.com/citusdata/p…
- C# - github.com/kevincolyar…
- Python - github.com/Tivix/djang…
- Unity - assetstore.unity.com/packages/to…
语句含义翻译
-
JavaScript - github.com/bradymholt/…
-
Java - github.com/RedHogs/cro…
-
Java - github.com/voidburn/cr…
-
Ruby - github.com/alpinweis/c…
-
Python - github.com/Salamek/cro…
-
PHP - github.com/panlatent/c…
-
Rust - github.com/cflockhart/…