首页 > 其他分享 >js实现cron表达式翻译成中文

js实现cron表达式翻译成中文

时间:2024-10-18 21:21:44浏览次数:3  
标签:month text else cron raw 翻译成 time date js

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

相关文章

  • 基于nodejs+vue基于SpringBoot和Vue的农产品智能交易系统[开题+源码+程序+论文]计算机
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景随着信息技术的快速发展,农产品交易领域也在逐渐走向智能化。关于农产品交易系统的研究,现有研究主要以传统交易模式的改进为主,专门针对结合SpringBoot和......
  • 基于nodejs+vue基于springboot和vue的耐思招聘网站的设计与实现[开题+源码+程序+论文]
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于招聘网站的研究,现有研究主要以大型综合性招聘平台为主,专门针对特定需求如耐思招聘网站这种集多种角色(用户、企业招聘者、校园招聘者等)于一体的研究......
  • 基于nodejs+vue基于springboot和vue的阆中旅游文化网站[开题+源码+程序+论文]计算机毕
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于旅游文化网站的研究,现有研究主要以热门旅游城市为主,专门针对阆中旅游文化的研究较少。阆中拥有丰富的旅游文化资源,如中天楼、华光楼、汉桓侯祠等众......
  • nvm 一个node.js版本管理工具
    nvm是什么nvm全英文也叫node.jsversionmanagement,是一个nodejs的版本管理工具。nvm和n都是node.js版本管理工具,为了解决node.js各种版本存在不兼容现象可以通过它可以安装和切换不同版本的node.js。下载地址:https://github.com/coreybutler/nvm-windows/releases一、nvm命令......
  • vue(vue.js)—内置指令v-text、v-html
    原文链接:vue(vue.js)—内置指令v-text、v-html–每天进步一点点(longkui.site)1.v-textv-text指令的基本功能是向其所在的标签中插入文本内容,需要注意的是,v-text会替换掉整个div的内容,实际开发中用的不多,1234567891011121314151617181920212223......
  • jsp二手车市场商户管理系492nz--程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表商家,店铺信息,二手车辆,租赁申请,退租申请,续租申请,提醒信息开题报告内容一、研究背景随着二手车市场的快速发展,商户管理问题日益凸显。商户信息散乱、管理......
  • jsp二手车交易平台6447v--程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,汽车类型,卖家,二手汽车,汽车订单,汽车退订开题报告内容一、研究背景随着汽车市场的不断扩大和消费者对二手车需求的增加,传统的二手车交易方式已无法满足......
  • jsp儿童疫苗接种管理系统q51zm(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表家长,接种人员,儿童信息,疫苗类型,疫苗信息,入库信息,出库信息,疫苗预约,接种信息,在线反馈,疫苗规划表开题报告内容一、项目背景随着公共卫生意识的提升,儿童......
  • jsp儿童成长信息管理系统t7728--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景在信息化时代背景下,儿童成长的记录与管理逐渐趋向于数字化、智能化。家长、教师及教育机构对儿童成长信息的关注日益增强,传统的纸质记......
  • 基于nodejs+vue基于SpringBoot共享单车管理信息平台[开题+源码+程序+论文]计算机毕业
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于共享单车管理信息平台的研究,现有研究主要以共享单车的运营模式、市场竞争等为主。专门针对基于SpringBoot框架构建共享单车管理信息平台的研究较少......