定时任务cron表达式详解

定时任务cron表达式详解

  • Cron

Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:
例子:

{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}
例 “0 0 12 ? * WED” 在每星期三下午12:00 执行(年份通常 省略)

Seconds Minutes Hours DayofMonth Month DayofWeek Year或
Seconds Minutes Hours DayofMonth Month DayofWeek

  • cron表达式
    字段 允许值 允许的特殊字符
    秒 0-59 , - * /
    分 0-59 , - * /
    小时 0-23 , - * /
    日期 1-31 , - * ? / L W C
    月份 1-12 或者 JAN-DEC , - * /
    星期 1-7 或者 SUN-SAT , - * ? / L C #
    年(可选) 留空, 1970-2099 , - * /

  • 字段含义
    *:代表所有可能的值
    -:指定范围
    ,:列出枚举 例如在分钟里,"5,15"表示5分钟和20分钟触发
    /:指定增量 例如在分钟里,"3/15"表示从3分钟开始,没隔15分钟执行一次
    ?:表示没有具体的值,使用?要注意冲突
    L:表示last,例如星期中表示7或SAT,月份中表示最后一天31或30,6L表示这个月倒数第6天,FRIL表示这个月的最后一个星期五
    W:只能用在月份中,表示最接近指定天的工作日
    #:只能用在星期中,表示这个月的第几个周几,例如6#3表示这个月的第3个周五

  • 实例:
    0 * * * * ? 每1分钟触发一次
    0 0 * * * ? 每天每1小时触发一次
    0 0 10 * * ? 每天10点触发一次
    0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发
    0 30 9 1 * ? 每月1号上午9点半
    0 15 10 15 * ? 每月15日上午10:15触发
    */5 * * * * ? 每隔5秒执行一次
    0 */1 * * * ? 每隔1分钟执行一次
    0 0 5-15 * * ? 每天5-15点整点触发
    0 0/3 * * * ? 每三分钟触发一次
    0 0 0 1 * ? 每月1号凌晨执行一次

*/5 * * * * ? 每隔5秒执行一次
0 */1 * * * ? 每隔1分钟执行一次
0 0 5-15 * * ? 每天5-15点整点触发
0 0/3 * * * ? 每三分钟触发一次
0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发
0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发
0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
0 0 12 ? * WED 表示每个星期三中午12点
0 0 17 ? * TUES,THUR,SAT 每周二、四、六下午五点
0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发
0 15 10 ? * MON-FRI 周一至周五的上午10:15触发
0 0 23 L * ? 每月最后一天23点执行一次
0 15 10 L * ? 每月最后一日的上午10:15触发
0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发
0 15 10 * * ? 2005 2005年的每天上午10:15触发
0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发
0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发
“30 * * * * ?” 每半分钟触发任务
“30 10 * * * ?” 每小时的10分30秒触发任务
“30 10 1 * * ?” 每天1点10分30秒触发任务
“30 10 1 20 * ?” 每月20号1点10分30秒触发任务
“30 10 1 20 10 ? *” 每年10月20号1点10分30秒触发任务
“30 10 1 20 10 ? 2011” 2011年10月20号1点10分30秒触发任务
“30 10 1 ? 10 * 2011” 2011年10月每天1点10分30秒触发任务
“30 10 1 ? 10 SUN 2011” 2011年10月每周日1点10分30秒触发任务
“15,30,45 * * * * ?” 每15秒,30秒,45秒时触发任务
“15-45 * * * * ?” 15到45秒内,每秒都触发任务
“15/5 * * * * ?” 每分钟的每15秒开始触发,每隔5秒触发一次
“15-30/5 * * * * ?” 每分钟的15秒到30秒之间开始触发,每隔5秒触发一次
“0 0/3 * * * ?” 每小时的第0分0秒开始,每三分钟触发一次
“0 15 10 ? * MON-FRI” 星期一到星期五的10点15分0秒触发任务
“0 15 10 L * ?” 每个月最后一天的10点15分0秒触发任务
“0 15 10 LW * ?” 每个月最后一个工作日的10点15分0秒触发任务
“0 15 10 ? * 5L” 每个月最后一个星期四的10点15分0秒触发任务
“0 15 10 ? * 5#3” 每个月第三周的星期四的10点15分0秒触发任务

  • cron表达式在vue中使用:
    <el-form>
      <el-row :gutter="24">
        <el-col :span="4">
          <el-form-item label="每:">
            <el-select v-model="myFrequency.base" style="width:90%;" @change="selectChange1">
              <el-option v-for="(item) in frequency" :label="item.label" :value="item.value" :key="item.value">
              </el-option>
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="5">
          <el-form-item v-show="myFrequency.base == 6" label="月=>">
            <el-select style="width:85%;" v-model="myFrequency.monthValues" multiple @change="selectChange6">
              <el-option v-for="(item,key) in monthValues" :label="item" :value="key" :key="key">
              </el-option>
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="5">
          <el-form-item v-show="myFrequency.base == 4" label="星期=>">
            <el-select v-model="myFrequency.dayValues" multiple style="width:80%;" @change="selectChange4">
              <el-option v-for="(item,key) in dayValues" :label="item" :value="key" :key="key">
              </el-option>
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="5">
          <el-form-item v-show="myFrequency.base >= 5" label="几号=>">
            <el-select style="width:69%" v-model="myFrequency.dayOfMonthValues" multiple @change="selectChange5">
              <el-option v-for="(item,index) in dayOfMonthValues" :label="item.label" :value="item.value" :key="index">
              </el-option>
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="5">
          <el-form-item v-show="myFrequency.base >= 2" :label="myFrequency.base >=3 ?'点222=>':'分钟11=>'">
            <el-select v-show="myFrequency.base >= 3" v-model="myFrequency.hourValues" multiple style="width:80%" @change="selectChange3">
              <el-option v-for="item in hourValues" :label="item" :value="item" :key="item">
              </el-option>
            </el-select>
            <el-select v-model="myFrequency.minuteValues" v-show="myFrequency.base <3" multiple style="width:70%" @change="selectChange2">
              <el-option v-for="item in minuteValues" :label="item" :value="item" :key="item">
              </el-option>
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="5">
          <el-form-item v-show="myFrequency.base >= 3" label="分钟=>">
            <el-select v-model="myFrequency.minuteValues" multiple style="width:70%" @change="selectChange2">
              <el-option v-for="item in minuteValues" :label="item" :value="item" :key="item">
              </el-option>
            </el-select>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="23">
          <el-form-item label="cron表达式:">
            {{jobCron}}
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>
 data() {
    return {
      jobCron: '',
      txtLen: 500,
      isCron: true,
      myFrequency: {
        base: 1,
        dayValues: '',
        dayOfMonthValues: '',
        monthValues: '',
        hourValues: '',
        minuteValues: ''
      },
      modifyFrequency: {
        dayValues: '',
        dayOfMonthValues: '',
        monthValues: '',
        hourValues: '',
        minuteValues: ''
      },
      frequency: [
        {
          value: 1,
          label: '分钟'
        },
        {
          value: 2,
          label: '小时'
        },
        {
          value: 3,
          label: '天'
        },
        {
          value: 4,
          label: '星期'
        },
        {
          value: 5,
          label: '月'
        },
        {
          value: 6,
          label: '年'
        }
      ],
      baseFrequency: {
        minute: 1,
        hour: 2,
        day: 3,
        week: 4,
        month: 5,
        year: 6
      },
      dayValues: {
        1: '星期日',
        2: '星期一',
        3: '星期二',
        4: '星期三',
        5: '星期四',
        6: '星期五',
        7: '星期六'
      },
      dayOfMonthValues: [
      ],
      monthValues: {
        1: '一月',
        2: '二月',
        3: '三月',
        4: '四月',
        5: '五月',
        6: '六月',
        7: '七月',
        8: '八月',
        9: '九月',
        10: '十月',
        11: '十一月',
        12: '十二月'
      },
      hourValues: [
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10,
        11,
        12,
        13,
        14,
        15,
        16,
        17,
        18,
        19,
        20,
        21,
        22,
        23
      ],
      minuteValues: [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55],
      baseCout: 0,
      id: '',
}

       getMothValue() {
      let list = []
      for (let i = 0; i < 31; i++) {
        let j = i
        let currentJson = {
          value: ++j,
          label: j + '号'
        }
        list[i] = currentJson
      }
      this.dayOfMonthValues = list
    },
    hasClear(val) {
      if (val < this.baseCout) {
        this.myFrequency.minuteValues = []
        this.myFrequency.hourValues = []
        this.myFrequency.dayValues = []
        this.myFrequency.dayOfMonthValues = []
        this.myFrequency.monthValues = []
      }
    },
    getCron(val) {
      var cron = ['0', '*', '*', '*', '*', '?']
      if (val && val >= this.baseFrequency.hour) {
        if (this.myFrequency.minuteValues.length == 0)
          this.myFrequency.minuteValues.push(0)
        cron[1] =
          typeof this.myFrequency.minuteValues !== 'undefined'
            ? this.myFrequency.minuteValues
            : '0'
      }
      if (val && val >= this.baseFrequency.day) {
        if (this.myFrequency.hourValues.length == 0)
          this.myFrequency.hourValues.push(0)
        cron[2] =
          typeof this.myFrequency.hourValues !== 'undefined'
            ? this.myFrequency.hourValues
            : '*'
      }
      if (val && val === this.baseFrequency.week) {
        if (this.myFrequency.dayValues.length == 0)
          this.myFrequency.dayValues.push('1')
        cron[3] = '?'
        cron[5] = this.myFrequency.dayValues
      }
      if (val && val >= this.baseFrequency.month) {
        if (this.myFrequency.dayOfMonthValues.length == 0)
          this.myFrequency.dayOfMonthValues.push(1)
        cron[3] =
          typeof this.myFrequency.dayOfMonthValues !== 'undefined'
            ? this.myFrequency.dayOfMonthValues
            : '?'
      }
      if (val && val === this.baseFrequency.year) {
        if (this.myFrequency.monthValues.length == 0)
          this.myFrequency.monthValues.push('1')
        cron[4] =
          typeof this.myFrequency.monthValues !== 'undefined'
            ? this.myFrequency.monthValues
            : '*'
      }
      this.jobCron = cron.join(' ')
    },
    selectChange1(val) {
      this.hasClear(val)
      this.baseCout = val
      console.log(',,',val)
      this.getCron(val)
    },
    selectChange2(val) {
      this.myFrequency.minuteValues = val
      this.getCron(this.myFrequency.base)
    },
    selectChange3(val) {
      this.myFrequency.hourValues = val
      this.getCron(this.myFrequency.base)
    },
    selectChange4(val) {
      this.myFrequency.dayValues = val
      this.getCron(this.myFrequency.base)
    },
    selectChange5(val) {
      this.myFrequency.dayOfMonthValues = val
      this.getCron(this.myFrequency.base)
    },
    selectChange6(val) {
      this.myFrequency.monthValues = val
      this.getCron(this.myFrequency.base)
    },
  • 表达式生成器
    有很多的cron表达式在线生成器,这里给大家推荐几款

http://www.pdtools.net/tools/becron.jsp

或者

http://cron.qqe2.com/

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值