
# Cron表达式使用说明
#### 操作场景
Cron表达式是一种用于指定定时任务的时间表达式，常用来指定任务的执行时间、执行频率和执行间隔。COC定时运维使用Quartz格式的Cron表达式，它由六个域组成，分别表示秒、分、时、日期、月份、星期，单个域有多个取值时，使用半角逗号,隔开取值。每个域可以是确定的取值，也可以是具有逻辑意义的特殊字符。
各字段的取值说明请参考[表1]。
#### 域取值
下表为Cron表达式中六个域分别支持的数值以及支持的特殊字符说明。
 表1Cron表达式域取值 
| **域** | **允许的数值** | **允许的特殊字符**        | **备注**                                                                                 |
|:---|:---|:---|:---|
| 秒     | 0\~59     | 不支持                | -                                                                                      |
| 分     | 0\~59     | \* /               | 任务的执行间隔大于30分钟。                                                                         |
| 小时    | 0\~23     | - \* /             | -                                                                                      |
| 日期    | 1\~31     | - \* ? / L         | -                                                                                      |
| 月份    | 1\~12     | JAN-DEC - \* /     | -                                                                                      |
| 星期    | 1\~7      | SUN-SAT - \* ? / L | 1：表示星期日，2：表示星期一，依次类推。 如果任务在每周一、周三、周四、周日执行，即1,2,4,5。 |
   
#### 特殊字符含义
Cron表达式中的每个域都支持一定数量的特殊字符，每个特殊字符有其特殊含义，下表为各特殊字符的说明。
表2Cron表达式特殊字符含义 
| **字符** | **含义**                               | **示例**                                                                                                                                                                                                                                   |
|:---|:---|:---|
| ,      | 表示分开的值。                              | 1,3,4,7,8。                                                                                                                                                                                                                               |
| \*     | 表示匹配域的任意值。                           | 在分这个域使用 \*，即表示每分钟都会触发事件。                                                                                                                                                                                                                 |
| ?      | 表示匹配域的任意值，但只能用在日期和星期两个域，因为这两个域会相互影响。 | 要在每月的20号触发调度，不管每个月的20号是星期几，则只能使用如下写法：13 13 15 20 \* ?。其中，因为日期域已经指定了20号，最后一位星期域只能用 ?，不能使用 \*。如果最后一位使用 \*，则表示不管星期几都会触发，与日期域的20号相斥，此时表达式不正确。                                                                                                |
| -      | 表示起止范围。                              | 在小时这个域使用8-10，表示从8时到10时每小时触发一次。                                                                                                                                                                                                           |
| /      | 表示起始时间开始触发，然后每隔固定时间触发一次。             | 在小时这个域使用，"\*/3"等同于"每3个小时"，即从0点开始每3小时触发；在日期这个域使用，"1/5"表示从第1号开始，每5天触发。                                                                                                                                                                     |
| L      | 表示最后，只能出现在日期和星期两个域。                  | - 在日期域中，L表示某个月的最后一天。  - 在星期这个域使用5L，意味着在最后的一个星期四触发。   |
   
#### 示例
下表为Cron表达式的常用取值示例。
表3Cron表达式示例 
| 示例                   | 说明                                  |
|:---|:---|
| 0 15 10 ? \* \*      | 每天上午10:15执行任务。                      |
| 0 0 10,14,16 \* \* ? | 每天上午10:00、下午14:00以及下午16:00执行任务。     |
| 0 40 9-17 \* \* ?    | 每天上午09:00至下午17:00时间段内每小时的第40分钟执行任务。 |
| 0 0/30 10-16 ? \* 2  | 每周一上午10:00至下午16:00时间段内每隔30分钟执行任务。   |
| 0 15 10 15 \* ?      | 每月15日上午10:15执行任务。                   |
| 0 15 10 L \* ?       | 每月最后一日上午10:15执行任务。                  |
| 0 0,30 14 ? 3 WED    | 每年3月的每个星期三下午14:00和14:30各执行一次任务。     |
   
#### 相关文档
Cron表达式的实际应用可参见[通过COC定时开关机节约成本](https://support.huaweicloud.com/bestpractice-coc/coc_case_04.html)。
