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号不是星期一,定时任务要不要执行呢?这就存在一种疑问,因此:
- **
Day of month
和Day of week
使用上有冲突,不可以一起用,用了这俩其中一个,另外一个要用?
; - 如果其中一个是
*
,另外一个也得是?
**(存疑)
合法的表达式:
* * 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周的周五执行一次,一个月执行一次
参考:
- Linux crontab: https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/crontab.html
- Quatz cron expression: http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html
- linux学习第六十三篇:Shell脚本介绍,Shell脚本结构和执行,date命令用法,Shell脚本中的变量
- 熔断Hystrix使用尝鲜
- 报警系统QuickAlarm之默认报警规则扩展
- PHP 面试知识梳理
- 报警系统QuickAlarm使用手册
- OpenDaylight Carbon二次开发实用指南
- 报警系统QuickAlarm之频率统计及接口封装
- 如何使用Sentry管理Hive外部表权限
- 报警系统QuickAlarm之报警规则解析
- 报警系统QuickAlarm之报警规则的设定与加载
- 报警系统QuickAlarm之报警执行器的设计与实现
- 如何在Kerberos与非Kerberos的CDH集群BDR不可用时复制数据
- 一个可扩展的报警系统Quick-Alarm
- 如何借助GitHub搭建属于自己的maven仓库
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- DB2 Linux平台安装 Part 4 创建数据库
- VBA编写Ribbon Custom UI编辑器03——认识Ribbon的xml
- VBA编写Ribbon Custom UI编辑器04——解析xml
- VBA编写Ribbon Custom UI编辑器05——转换结构体XML
- MySQL 8.0.19 Linux平台安装 Part 1
- MySQL 8.0.19 Linux平台安装 Part 2
- 使用XtraBackup备份MySQL 8.0 Part 1 xtrabackup 8.0 安装
- 10个解放双手的 IDEA 插件,少些冤枉代码!
- 二叉树的 4 种遍历方式,你会多少?
- 【C++简明教程】Python和C++指定元素排序比较
- PG原生解码工具pg_recvlogical的使用-在脑裂时帮我们找回丢失的数据
- 使用XtraBackup备份MySQL 8.0 Part 4 对数据库进行全备
- 介绍一下java的基本类型; 每种数据类型的位数(答错了,太菜了)
- 可读代码编写炸鸡十一 - 小黄鸭从你的心里游到脑子里
- 大数据技术之Hadoop(HDFS)第1章 HDFS概述