专栏首页授客的专栏Java Spring cron表达式使用详解

Java Spring cron表达式使用详解

语法格式

Seconds Minutes Hours DayofMonth Month DayofWeek Year

Seconds Minutes Hours DayofMonth Month DayofWeek

域字段说明

域 取值范围 允许的特殊字符

秒(Seconds) 0-59 , - * /

分(Minutes) 0-59 , - * /

小时(Hours) 0-23 , - * /

日期(DayofMonth) 1-31 , - * / L W C

月份(Month) 1-12、JAN-DEC , - * /

星期(DayofWeek) 1-7或者 SUN-SAT , - * ? / L C #

年(Year,可选) 留空, 1970-2099 , - * /

* 表示匹配该域的所有值,比如在Minutes域使用 * , 即表示每分钟都会触发事件。

? 只能用在DayofMonth和DayofWeek两个域中使用。它被用来指定“非明确的值”。因为DayofMonth和 DayofWeek会相互影响,当着两个元素互斥时,应该通过设置一个问号(?)来表明不想设置那个字段。例如,想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用*,如果使用 * 表示不管星期几都会触发,实际上并不是这样。

- 表示范围,例如,在Minutes域使用 5-20,表示从5分到20分钟,每分钟触发一次。又如在Hours域使用 10-12,表示从10点到12点,每小时即每个整点触发一次。

/ 用来指定渐增的值。例如在Seconds域使用 0/15,表示从第0秒开始(包括第0秒),每15秒钟触发一次,即在第0,15,30,45秒的时候各触发一次。又如在Seconds域使用5/15,表示从第5秒开始,每15秒触发一次,即在在第5,20,35,50秒的时候各触发一次。

在/前面指定0、*是等价的,即 */ 和 0/ 是等价的。

注意:触发事件执行的时间点必须是在取值范围内才有效。比如 在Minutes域使用 40/20,表示从第40分钟开始,每20分钟执行一次,但是Minutes取值范围为0-59,40+20=60,不在取值范围内,所以仅会在每小时的第40分钟执行一次。而如果设置为40/10,则会在第40,50分钟各执行一次。又如在Month域中设置 7/6,则仅会在7月出发一次。

, 用于指定枚举值。比如,在Minutes域使用5,20,则表示在第5,20分钟时各触发一次。又如,在DayofWeek使用 MON,WED,FRI,表示星期一、星期三、星期五

L 表示最后(last),只能用于DayofWeek和DayofMonth域,如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。如果在DayofMonth域中使用 L 则表示一个月的最后一天--非闰年,对于1月来说,则是1.31,对于2月则是2.28 , 如果在DayofWeek域使用L则表示 7 或者 SAT 即星期六,如果在DayofWeek域使用L,并在L前面加上数字,它表示该月最后一个星期×,例如 6L 就表示一个月的最后一个 星期五

W 只能用于DayofMonth域。用来指定离给定日期最近的工作日(周一到周五)。比如DayofMonth域使用 15W,则表示"离该月15号最近的工作日"。因此如果15号为周六,触发器会在14号即周五调用。如果15号为周日,触发器会在16号也就是周一触发。如果15号为周二,那么当天就会触发。然而如果你将DayofMonth域设为 1W ,而1号又是周六,触发器会于下周一也就是当月的3号触发,因为它不会越过当月的值的范围边界。

LW L和W 这两个字符可以组合为 LW,用于DayofMonth域,表示该月最后一个工作日,即最后一个星期五。

# 字符可用于DayofWeek域。表示“该月第几个周×”,比如"6#3"表示该月第三个周五( 6表示周五,而#3 表示该月第三个)。又如 "2#1" 表示该月第一个周一。

注意:如果指定"5#5",该月没有第五个“周5”,该月是不会触发的,即第几个周x必须在当月范围内存在。

C 字符可用于DayofWeek和DayofMonth域,是"calendar"的缩写。它表示为基于相关的日历所计算出的值(如果有的话)。如果没有关联的日历,那它等同于包含全部日历。例如,DayofMonth域使用 5C,则表示"日历中的第一天或者5号以后",DayofWeek域使用 1C 则表示"日历中的第一天或者周日以后"。

常见的一些例子

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触发

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SoapUI 访问代理设置

    运行SoapUI时,发现接口访问不通,如下图,提示"Connection to http://127.0.0.1:8080"

    授客
  • Linux CentOS下Python+robot framework环境搭建

    下载地址:http://www.centoscn.com/CentosSoft/iso/2013/1205/2196.html

    授客
  • Fiddler 使用fiddler无法抓取苹果手机https请求问题解决方案

    手机浏览器访问代理主机监听端口(例中为:http://192.168.0.104:8888,其中192.168.0.104为fiddler所在主机地址,8888...

    授客
  • Spring Boot 如何快速实现定时任务

    在开发项目的时候,使用定时任务的情况还是非常之多的,比如说:早上八点统一推送昨天的“战报”、金融相关行业则会涉及每天的对账等。

    田维常
  • Quarzt定时调度任务

    简介 Quarzt是一个项目中定时执行任务的开源项目,Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J...

    李家酒馆酒保
  • Springboot的默认定时任务——Scheduled注解

    本博客参考博文地址。 1.pom依赖: 引入springboot starter包即可 <dependencies> <dependency> ...

    用户1134788
  • Hybris CronJob

    一、概念     CronJobs提供了在特定的时间或者间隔内处理业务逻辑的方法。一般创建一个Cronjob有两种方式,第一种是定义Java类,由Hybris生...

    JMCui
  • Spring之定时任务基本使用篇

    文章链接:https://liuyueyi.github.io/hexblog/2018/08/01/180801-Spring之定时任务基本使用篇/

    一灰灰blog
  • Cron表达式

    源码地址:http://download.csdn.net/download/xushaonian/5790307

    跟着阿笨一起玩NET
  • Spring Task中cron表达式详解

    _{秒}:取值范围(0-59),不允许为空值,若值不合法,调度器将抛出SchedulerException异常

    JouyPub

扫码关注云+社区

领取腾讯云代金券