js实现cron表达式翻译成中文
参考项目
https://github.com/ikesnowy/cron-chinese
对他的代码进行改进:
只能翻译 分 时 日 月 周 和这五个符号: * ? - / ,
export function humanizeCronInChinese(cron) {
const tokens = cron.trim().split(' ');
const cronStruct = {
time: {
minute: compileNode(tokens[0]),
hour: compileNode(tokens[1]),
},
date: {
dayInMonth: compileNode(tokens[2]),
month: compileNode(tokens[3]),
dayInWeek: compileNode(tokens[4]),
},
};
cronStruct.date = compileDatePart(cronStruct.date);
cronStruct.time = compileTimePart(cronStruct.time);
if (cronStruct.date.anyCount === 3 && cronStruct.time.text[0] === '每') {
// 避免 '每日每分钟' 出现
cronStruct.date.text = '';
}
return cronStruct.date.text + cronStruct.time.text;
}
function compileNode(raw) {
const compiled = { raw };
compiled.isUnfixed = raw === '?';
compiled.isAny = raw === '*';
compiled.hasStepping = raw.indexOf('/') >= 0;
compiled.hasList = raw.indexOf(',') >= 0;
compiled.hasRange = raw.indexOf('-') >= 0;
compiled.values = raw.split(',');
return compiled;
}
function compileDatePart(date) {
if (date.dayInWeek.isUnfixed) {
if (date.month.isAny) {
if (date.dayInMonth.isAny) {
// 每天
date.text = '每天';
} else if (date.dayInMonth.hasRange) {
// 每月1-3号,每天
date.text = '每月' + parseDayInMonthToken(date.dayInMonth) + '每天';
} else if (date.dayInMonth.hasStepping) {
// 每月从1号开始(间隔3天)每天
date.text = '每月' + parseDayInMonthToken(date.dayInMonth) + '每天';
} else if (date.dayInMonth.hasList) {
// 每月的1,2,3号,每天
date.text = '每月的' + parseDayInMonthToken(date.dayInMonth) + '每天';
} else {
// 每月的1号
date.text = '每月的' + parseDayInMonthToken(date.dayInMonth);
}
} else if (date.month.hasRange) {
if (date.dayInMonth.isAny) {
// 每年1-3月每天
date.text = '每年' + parseMonthToken(date.month) + ',每天';
} else if (date.dayInMonth.hasRange) {
// 每年1-3月,每月1-3号,每天
date.text = '每年' + parseMonthToken(date.month) + ',每月' + parseDayInMonthToken(date.dayInMonth) + '号,每天';
} else if (date.dayInMonth.hasStepping) {
// 每年1-3月,每月从1号开始(间隔3天),每天
date.text = '每年' + parseMonthToken(date.month) + ',每月' + parseDayInMonthToken(date.dayInMonth) + ',每天';
} else if (date.dayInMonth.hasList) {
// 每年的1-3月,每月的1,2,3号,每天
date.text = '每年' + parseMonthToken(date.month) + ',每月的' + parseDayInMonthToken(date.dayInMonth) + '号,每天';
} else {
// 每年的1月1号
date.text = '每年' + parseMonthToken(date.month) + parseDayInMonthToken(date.dayInMonth);
}
} else if (date.month.hasStepping) {
if (date.dayInMonth.isAny) {
// 每年从1月起(间隔2个月),每月每天
date.text = '每年' + parseMonthToken(date.month) + ',每月每天';
} else if (date.dayInMonth.hasRange) {
// 每年从1月开始(间隔2个月),每月1-3号,每天
date.text = '每年' + parseMonthToken(date.month) + ',每月' + parseDayInMonthToken(date.dayInMonth) + '号,每天';
} else if (date.dayInMonth.hasStepping) {
// 每年从1月开始(间隔2个月),每月从1号开始(间隔3天),每天
date.text = '每年' + parseMonthToken(date.month) + ',每月' + parseDayInMonthToken(date.dayInMonth) + ',每天';
} else if (date.dayInMonth.hasList) {
// 每年从1月开始(间隔2个月),每月的1,2,3号,每天
date.text = '每年' + parseMonthToken(date.month) + ',每月的' + parseDayInMonthToken(date.dayInMonth) + '号,每天';
} else {
// 每年从1月开始(间隔2个月),每月1号
date.text = '每年' + parseMonthToken(date.month) + ',每月' + parseDayInMonthToken(date.dayInMonth);
}
} else if (date.month.hasList) {
if (date.dayInMonth.isAny) {
// 每年1,2,3月,每月每天
date.text = '每年' + parseMonthToken(date.month) + ',每月每天';
} else if (date.dayInMonth.hasRange) {
// 每年1,2,3月,每月1-3号,每天
date.text = '每年' + parseMonthToken(date.month) + ',每月' + parseDayInMonthToken(date.dayInMonth) + '每天';
} else if (date.dayInMonth.hasStepping) {
// 每年1,2,3月,每月从1号开始(间隔3天),每天
date.text = '每年' + parseMonthToken(date.month) + ',每月' + parseDayInMonthToken(date.dayInMonth) + ',每天';
} else if (date.dayInMonth.hasList) {
// 每年1,2,3月,每月的1,2,3号,每天
date.text = '每年' + parseMonthToken(date.month) + ',每月' + parseDayInMonthToken(date.dayInMonth) + '号,每天';
} else {
// 每年1,2,3月,每月1号
date.text = '每年' + parseMonthToken(date.month) + ',每月的' + parseDayInMonthToken(date.dayInMonth);
}
} else {
if (date.dayInMonth.isAny) {
// 每年1月每天
date.text = '每年' + parseMonthToken(date.month) + '每天';
} else if (date.dayInMonth.hasRange) {
// 每年1月1-3号,每天
date.text = '每年' + parseMonthToken(date.month) + parseDayInMonthToken(date.dayInMonth) + ',每天';
} else if (date.dayInMonth.hasStepping) {
// 每年1月从1号开始(间隔3天),每天
date.text = '每年' + parseMonthToken(date.month) + parseDayInMonthToken(date.dayInMonth) + ',每天';
} else if (date.dayInMonth.hasList) {
// 每年1月的1,2,3号,每天
date.text = '每年' + parseMonthToken(date.month) + '的' + parseDayInMonthToken(date.dayInMonth) + '号,每天';
} else {
// 每年1月1号
date.text = '每年' + parseMonthToken(date.month) + parseDayInMonthToken(date.dayInMonth) + '号';
}
}
} else if (date.dayInMonth.isUnfixed) {
if (date.month.isAny) {
if (date.dayInWeek.isAny) {
date.text = '每天';
} else if (date.dayInWeek.hasRange) {
// 每月周1到周3,每天
date.text = '每月' + parseDayInWeekToken(date.dayInWeek) + '每天';
} else if (date.dayInWeek.hasStepping) {
// 每月从周1开始(间隔3天)每天
date.text = '每月' + parseDayInWeekToken(date.dayInWeek) + '每天';
} else if (date.dayInWeek.hasList) {
// 每月的周1,周2,周3,每天
date.text = '每月的' + parseDayInWeekToken(date.dayInWeek) + '每天';
} else {
// 每月的周一
date.text = '每月的' + parseDayInWeekToken(date.dayInWeek);
}
} else if (date.month.hasRange) {
if (date.dayInWeek.isAny) {
// 每年1-3月,每月每天
date.text = '每年' + parseMonthToken(date.month) + ',每月每天';
} else if (date.dayInWeek.hasRange) {
// 每年1-3月,每月周1到周3,每天
date.text = '每年' + parseMonthToken(date.month) + ',每月' + parseDayInWeekToken(date.dayInWeek) + ',每天';
} else if (date.dayInWeek.hasStepping) {
// 每年1-3月,每月从周1开始(间隔3天),每天
date.text = '每年' + parseMonthToken(date.month) + ',每月' + parseDayInWeekToken(date.dayInWeek) + ',每天';
} else if (date.dayInWeek.hasList) {
// 每年1-3月,每月的周1,周2,周3,每天
date.text = '每年' + parseMonthToken(date.month) + ',每月的' + parseDayInWeekToken(date.dayInWeek) + ',每天';
} else {
// 每年1-3月,每月的周一
date.text = '每年' + parseMonthToken(date.month) + ',每月的' + parseDayInWeekToken(date.dayInWeek);
}
} else if (date.month.hasStepping) {
if (date.dayInWeek.isAny) {
// 每年从1月开始(间隔2个月),每月每天
date.text = '每年' + parseMonthToken(date.month) + ',每月每天';
} else if (date.dayInWeek.hasRange) {
// 每年从1月开始(间隔2个月),每月的周1到周3
date.text = '每年' + parseMonthToken(date.month) + ',每月的' + parseDayInWeekToken(date.dayInWeek);
} else if (date.dayInWeek.hasStepping) {
// 每年从1月开始(间隔2个月),每月从周1开始(间隔3天),每天
date.text = '每年' + parseMonthToken(date.month) + ',每月' + parseDayInWeekToken(date.dayInWeek) + ',每天';
} else if (date.dayInWeek.hasList) {
// 每年从1月开始(间隔2个月),每月的周1,周2,周3,每天
date.text = '每年' + parseMonthToken(date.month) + ',每月的' + parseDayInWeekToken(date.dayInWeek) + ',每天';
} else {
// 每年从1月开始(间隔2个月),每月的周一
date.text = '每年' + parseMonthToken(date.month) + ',每月的' + parseDayInWeekToken(date.dayInWeek);
}
} else if (date.month.hasList) {
if (date.dayInWeek.isAny) {
// 每年的1,2,3月,每月每天
date.text = '每年的' + parseMonthToken(date.month) + ',每月每天';
} else if (date.dayInWeek.hasRange) {
// 每年的1,2,3月,每月的周1到周3,每天
date.text = '每年的' + parseMonthToken(date.month) + ',每月的' + parseDayInWeekToken(date.dayInWeek) + ',每天';
} else if (date.dayInWeek.hasStepping) {
// 每年的1,2,3月,每月从周1开始(间隔3天),每天
date.text = '每年的' + parseMonthToken(date.month) + ',每月' + parseDayInWeekToken(date.dayInWeek) + ',每天';
} else if (date.dayInWeek.hasList) {
// 每年的1,2,3月,每月的周1,周2,周3,每天
date.text = '每年的' + parseMonthToken(date.month) + ',每月的' + parseDayInWeekToken(date.dayInWeek) + ',每天';
} else {
// 每年的1,2,3月,每月的周一
date.text = '每年的' + parseMonthToken(date.month) + ',每月的' + parseDayInWeekToken(date.dayInWeek);
}
} else {
if (date.dayInWeek.isAny) {
// 每年1月每天
date.text = '每年' + parseDayInWeekToken(date.dayInWeek) + '每天';
} else if (date.dayInWeek.hasRange) {
// 每年1月的周一到周三,每天
date.text = '每年' + parseMonthToken(date.month) + '的' + parseDayInWeekToken(date.dayInWeek) + ',每天';
} else if (date.dayInWeek.hasStepping) {
// 每年1月从周一开始(间隔3天),每天
date.text = '每年' + parseMonthToken(date.month) + parseDayInWeekToken(date.dayInWeek) + ',每天';
} else if (date.dayInWeek.hasList) {
// 每年1月的周一,周二,周三,每天
date.text = '每年' + parseMonthToken(date.month) + '的' + parseDayInWeekToken(date.dayInWeek) + ',每天';
} else {
// 每年1月的周一
date.text = '每年' + parseMonthToken(date.month) + '的' + parseDayInWeekToken(date.dayInWeek);
}
}
}
return date;
}
function compileTimePart(time) {
time.anyCount = time.hour.isAny + time.minute.isAny;
if (time.anyCount === 2) {
time.text = '每分钟';
} else if (time.anyCount === 1) {
if (time.hour.isAny) {
// 每小时 X 分
if (time.minute.hasStepping) {
const parts = time.minute.raw.split('/');
time.text = '每小时的第' + parts[0] + '分开始(间隔' + parts[1] + '分钟)';
} else if (time.minute.hasRange) {
time.text = '每小时的' + time.minute.raw + '分,每分钟';
} else {
time.text = '每小时的第' + time.minute.raw + '分钟';
}
} else {
// X 时每分钟
if (time.hour.hasRange) {
time.text = '的' + time.hour.raw + '点每分钟';
} else if (time.hour.hasStepping) {
const parts = time.hour.raw.split('/');
time.text = '从第' + parts[0] + '点开始(间隔' + parts[1] + '小时)每分钟';
} else {
time.text = '的' + time.hour.raw + '点每分钟';
}
}
} else {
if (time.hour.hasRange) {
if (time.minute.hasRange) {
time.text = parseHourHasRange(time.hour.raw) + '的' + parseMinuteHasRange(time.minute.raw) + '每分钟';
} else if (time.minute.hasStepping) {
time.text = parseHourHasRange(time.hour.raw) + parseMinuteHasStepping(time.minute.raw);
} else if (time.minute.hasList) {
time.text = parseHourHasRange(time.hour.raw) + '的' + parseMinuteHasList(time.minute.raw);
} else {
time.text = parseHourHasRange(time.hour.raw) + time.minute.raw + '分';
}
} else if (time.hour.hasStepping) {
if (time.minute.hasRange) {
time.text = parseHourHasStepping(time.hour.raw) + '的' + parseMinuteHasRange(time.minute.raw + '每分钟');
} else if (time.minute.hasStepping) {
time.text = parseHourHasStepping(time.hour.raw) + parseMinuteHasStepping(time.minute.raw);
} else if (time.minute.hasList) {
time.text = parseHourHasStepping(time.hour.raw) + '的' + parseMinuteHasList(time.minute.raw);
} else {
time.text = parseHourHasStepping(time.hour.raw) + '的' + time.minute.raw + '分';
}
} else if (time.hour.hasList) {
if (time.minute.hasRange) {
time.text = parseHourHasList(time.hour.raw) + '的' + parseMinuteHasRange(time.minute.raw);
} else if (time.minute.hasStepping) {
time.text = parseHourHasList(time.hour.raw) + parseMinuteHasStepping(time.minute.raw);
} else if (time.minute.hasList) {
time.text = parseHourHasList(time.hour.raw) + '的' + parseMinuteHasList(time.minute.raw);
} else {
time.text = parseHourHasList(time.hour.raw) + time.minute.raw + '分';
}
} else {
if (time.minute.hasRange) {
time.text = time.hour.raw + '点' + parseMinuteHasRange(time.minute.raw);
} else if (time.minute.hasStepping) {
time.text = time.hour.raw + '点' + parseMinuteHasStepping(time.minute.raw);
} else if (time.minute.hasList) {
time.text = time.hour.raw + '点' + parseMinuteHasList(time.minute.raw);
} else {
time.text = time.hour.raw.padStart(2, '0') + ':' + time.minute.raw.padStart(2, '0');
}
}
}
return time;
}
function parseMonthToken(month) {
if (month.hasRange) {
return month.raw + '月';
} else if (month.hasStepping) {
// 从1月开始(间隔3个月)
const parts = month.raw.split('/');
return '从' + parts[0] + '月开始(间隔' + parts[1] + '个月)';
} else if (month.hasList) {
return month.raw + '月';
} else {
return month.raw + '月';
}
}
function parseDayInMonthToken(dayInMonth) {
if (dayInMonth.hasRange) {
return dayInMonth.raw + '号';
} else if (dayInMonth.hasStepping) {
const parts = dayInMonth.raw.split('/');
// 从1号开始(间隔3天)
return '从' + parts[0] + '号开始(间隔' + parts[1] + '天)';
} else if (dayInMonth.hasList) {
return dayInMonth.raw + '号';
} else {
return dayInMonth.raw + '号';
}
}
function parseDayInWeekToken(dayInWeek) {
if (dayInWeek.hasRange) {
const parts = dayInWeek.raw.split('-');
return '周' + dayInWeekNameMap[Number(parts[0])] + '到周' + dayInWeekNameMap[Number(parts[1])];
} else if (dayInWeek.hasStepping) {
// 从周1开始(间隔3天)
const parts = dayInWeek.raw.split('/');
return '从周' + dayInWeekNameMap[parts[0]] + '开始(间隔' + parts[1] + '天)';
} else if (dayInWeek.hasList) {
return dayInWeek.raw
.split(',')
.map((x) => '周' + dayInWeekNameMap[Number(x)])
.join(',');
} else {
return '周' + dayInWeekNameMap[dayInWeek.raw];
}
}
function parseHourHasRange(raw) {
return raw + '点每点';
}
function parseHourHasStepping(raw) {
const parts = raw.split('/');
return '从' + parts[0] + '点开始(间隔' + parts[1] + '小时)每小时';
}
function parseHourHasList(raw) {
return raw + '点每点';
}
function parseMinuteHasRange(raw) {
return raw + '分';
}
function parseMinuteHasStepping(raw) {
const parts = raw.split('/');
return '从第' + parts[0] + '分开始(间隔' + parts[1] + '分钟)每分钟';
}
function parseMinuteHasList(raw) {
return raw + '分';
}
const dayInWeekNameMap = ['日', '一', '二', '三', '四', '五', '六'];
const dayInWeekMap = ['SUN', 'MON', 'TUE', 'WEB', 'THU', 'FRI', 'SAT'].map((x) => new RegExp(x, 'ig'));
const monthMap = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC'].map((x) => new RegExp(x, 'ig'));
标签:month,text,else,cron,raw,翻译成,time,date,js
From: https://blog.csdn.net/weixin_44441199/article/details/143062402