需求:将日期格式转成Java的cron表达式传给后台,回显时候将Java的cron表达式反解析成日期格式
首先,了解一些Java的cron表达式:(可参考https://www.jianshu.com/p/e9ce1a7e1ed1对cron表达式的详解)
举例说明
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
wloopValue :[{id: '2', name: '星期一'}, {id: '3', name: '星期二'}, {id: '4', name: '星期三'}, {id: '5', name: '星期四'}, {id: '6', name: '星期五'}, {id: '7', name: '星期六'}, {id: '1', name: '星期日'}]
mloopValue :[1,2,3,...31]
解析成cron表达式:
// 循环条件转成cron表达式 (基于vue)
dateChangeCron (dates) { //dates 为传进来的整个日期类型的对象 effectTime:yyyy-MM-d:h为执行时间点
let m = ''
let s = ''
let h = ''
let w = dates.wloopValue || ''
let mo = dates.mloopValue || ''
if (dates.effectTime) {
h = dates.effectTime.getHours()
m = dates.effectTime.getMinutes()
s = dates.effectTime.getSeconds()
}
let loopType = dates.loopType
//loopType :[{value: 'ONE_TIME', label: '单次执行'},
// {value: 'DAILY', label: '按天循环'},
// {value: 'WEEKLY', label: '按周循环'},
// {value: 'MONTHLY', label: '按月循环'}]
var cron = ''
if (loopType === 'DAILY') {
cron = s + ' ' + m + ' ' + h + ' * * ? *'
} else if (loopType === 'WEEKLY') { // 星期天为1,星期6为7
cron = s + ' ' + m + ' ' + h + ' * * ' + w.join(',') + ' *'
} else if (loopType === 'MONTHLY') { // 1-31
cron = s + ' ' + m + ' ' + h + ' ' + mo.join(',') + ' * ? *'
}
return cron
// console.log(cron) 19 30 16 * * 2,3 *
}
反解析cron表达式:
// cron表达式转成循环条件
// cron 为空的为单次循环
// 29 29 16 * * ? * 按天
// 19 30 16 * * 2,3 * 按周
// 44 30 16 2,4,21 * ? * 按月
// 提取特殊字符串长度(scrstr 源字符串 armstr 特殊字符)
cronChangeDate (str) {
var toDate = {}
if (!str) {
toDate.loopType = '单次循环'
} else {
var result = str.split(' ').join('')
var nArr = str.split(' ')
var countData = this.getPlaceholderCount(result)
if (!countData.count1) { // 没有'?'则是按周循环
toDate.loopType = '周循环'
var keys = nArr[5]
var en2cnMap = {
1: '周天',
2: '周一',
3: '周二',
4: '周三',
5: '周四',
6: '周五',
7: '周六'
}
var cnKeys = keys.split(',').map(function (key, idx) {
return en2cnMap[key];
})
toDate.loopValue = cnKeys.join(',')
} else if (countData.count1 + countData.count2 === 3) {
toDate.loopType = '月循环'
var mot = []
var mkeys = nArr[3].split(',')
for (var i = 0; i < mkeys.length; i++) {
let mo = mkeys[i] + '号'
mot.push(mo)
}
toDate.loopValue = mot.join(',')
} else {
toDate.loopType = '天循环'
}
toDate.loopTime = nArr[2] + ':' + nArr[1] + ':' + nArr[0]
}
return toDate
// console.log(toDate) {loopType: "月循环", loopValue: "2号,4号,21号", loopTime: "16:30:44"}
},
// 统计字符串中包含某个字符的个数
getPlaceholderCount (strSource) {
var count1 = 0 // ?的个数
var count2 = 0 // *的个数
strSource.replace(/\*|\?/g, function (m, i) {
if (m === '?') {
count1++
} else if (m === '*') {
count2++
}
});
var obj = {}
obj.count1 = count1
obj.count2 = count2
return obj //返回一个对象,根据需要得到想要的值
}