Spring 和 Linux 下的 cron 表达式总结

Java 程序员经常使用 Spring 的定时任务,定义 cron 表达式。它与 Linux 下的 Crontab 表达式长的类似,但含义又有些不一样。

Linux 的 Crontab

Linux 下的 Crontab 表达式有五个域,分表表示:分钟、小时、日期、月、星期。

1
2
3
4
5
6
7
8
9
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed

特殊字符

在每个域中除了指定特定值外,还可以使用如下特殊字符:

  • 星号(*):代表所有可能的值,例如月域如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。

  • 逗号(,):代表枚举值,可用来隔开指定一个列表范围,例如,“1,2,5,7,8,9”

  • 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”

  • 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如 */10,如果用在 minute 字段,表示每十分钟执行一次。

Spring 的 cron

Spring 的 cron 表达式有六或七个域,区别是最后一位年是可选的。

分别表示:秒、分钟、小时、日期、月份、星期、[年]

特殊字符

同样的,每个域也可以使用特殊字符,特殊字符:【*】,【,】,【-】,【/】与 Crontab 含义一样,除此之外还支持另外一些特殊字符:

  • (?):也表示任意值,只能用在“日期”和“星期”域,当这两个域其中之一使用了【*】后,为了避免冲突,需要将另一个域的值设为【?】。

  • (L):表示最后,Last 的意思,只能出现在“星期”和“日期”域,如果在“星期”域使用 5L,则表示在最后的一个星期四触发。

  • (W):表示有效工作日(周一到周五),只能出现在日期域,系统将在离指定日期的最近的有效工作日触发事件。

  • (LW):这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。例如:在日期域使用 5W,如果 5 日是星期六,则将在最近的工作日:星期五,即 4 号触发;如果 5 日是星期天,则在 6 日触发;如果 5 日在星期一到星期五中的一天,则就在 5 日触发。另外一点,W 的最近寻找不会跨过月。

  • (#):用于确定每个月第几个星期几,只能出现在“星期”域。例如在 6#3,表示某月的第三个星期五。

示例

0 0 10,14,16 * * ?:每天上午 10 点,下午 2 点,4 点

0 0/30 9-17 * * ?:朝九晚五工作时间内每半小时

0 0 12 ? * WED:表示每个星期三中午 12 点

0 0 12 * * ?:每天中午 12 点触发

0 15 10 ? * *:每天上午 10:15 触发

0 15 10 * * ?:每天上午 10:15 触发

0 15 10 * * ? *:每天上午 10:15 触发

0 15 10 * * ? 2005:2005 年的每天上午 10:15 触发

0 * 14 * * ?:在每天下午 2 点到下午 2:59 期间的每 1 分钟触发

0 0/5 14 * * ?:在每天下午 2 点到下午 2:55 期间的每 5 分钟触发

0 0/5 14,18 * * ?:在每天下午 2 点到 2:55 期间和下午 6 点到 6:55 期间的每 5 分钟触发

0 0-5 14 * * ?:在每天下午 2 点到下午 2:05 期间的每 1 分钟触发

0 10,44 14 ? 3 WED:每年三月的星期三的下午 2:10 和 2:44 触发

0 15 10 ? * MON-FRI:周一至周五的上午 10:15 触发

0 15 10 15 * ?:每月 15 日上午 10:15 触发

0 15 10 L * ?:每月最后一日的上午 10:15 触发

0 15 10 ? * 6L:每月的最后一个星期五上午 10:15 触发

0 15 10 ? * 6L 2002-2005:2002 年至 2005 年的每月的最后一个星期五上午 10:15 触

0 15 10 ? * 6#3:每月的第三个星期五上午 10:15 触发

参考文章

http://cron.qqe2.com/

https://www.cnblogs.com/mingyue1818/p/5764050.html