linux的crontab任务配置基本格式:
* * * * * command分钟(0-59) 小时(0-23) 日期(1-31) 月份(1-12) 星期(0-6,0代表星期天) 命令
校验是否正确:http://cron.schlitt.info/index.php?cron=30+7+*+*+*&iterations=100&test=Test
解析成cron表达式:
// 循环条件转成cron表达式
dateChangeCron (dates) {
let m = ''
let h = ''
let w = dates.wloopValue || ''
let mo = dates.mloopValue || ''
if (dates.effectTime) {
h = dates.effectTime.getHours()
m = dates.effectTime.getMinutes()
}
let loopType = dates.loopType // 获取的参数,即循环方式
var cron = ''
if (loopType === 'DAILY') { //天循环
cron = m + ' ' + h + ' * * *'
} else if (loopType === 'WEEKLY') { // 星期天为0,星期6为6,周循环
cron = m + ' ' + h + ' * * ' + w.join(',')
} else if (loopType === 'MONTHLY') { // 1-31,月循环
cron = m + ' ' + h + ' ' + mo.join(',') + ' * *'
}
return cron
}
反解析cron表达式(将cron表达式解析成日期):
// 1 7 * * *
// 1 7 * * 1,2,4,0
// 1 7 1,16,30 * *
let cronChangeDate = str => {
var toDate = {}
if (!str) {
toDate.loopType = '单次循环' //空的为单次,即不循环
} else {
var result = str.split(' ').join('')
var count = 0 // *的个数
result.replace(/\*/g, function (m, i) { // '*'需要转义
if (m === '*') {
count++
}
})
var nArr = str.split(' ')
var strLast = str.charAt(str.length - 1)
if (count > 2) { // *的数量为3则为按天循环
toDate.loopType = '天循环'
} else if (strLast === '*' && count === 2) { // 最后一个为*则为按月循环
toDate.loopType = '月循环'
var mot = []
var mkeys = nArr[2].split(',')
for (var i = 0; i < mkeys.length; i++) {
let mo = mkeys[i] + '号'
mot.push(mo)
}
toDate.loopValue = mot.join(',')
} else {
toDate.loopType = '周循环'
var keys = nArr[4]
var en2cnMap = { //跟java的星期对应不一样,java的对应为1-7对应周天-周六
0: '周天',
1: '周一',
2: '周二',
3: '周三',
4: '周四',
5: '周五',
6: '周六'
}
if (keys) {
var cnKeys = keys.split(',').map(function (key, idx) {
return en2cnMap[key];
})
toDate.loopValue = cnKeys.join(',')
}
}
toDate.loopTime = nArr[1] + ':' + nArr[0]
}
return toDate //返回一个对象,根据需要解析成想要的样子
}