网站程序源码上传到空间打开网站首页还是显示的程序原源代码,专业的公司网页制作,东莞企业网站seo,o2o有哪些电商平台碰到个需求#xff0c;后端返回给前端的时候如果直接返回表达式给前端在页面展示#xff0c;用户会看不懂#xff01;所以要转为非开发人员看到也能明白的中文描述
这里说一下后端解析#xff0c;无非就是空格切分一个个判断了#xff1a;
前端js解析在这里#xff1a;…碰到个需求后端返回给前端的时候如果直接返回表达式给前端在页面展示用户会看不懂所以要转为非开发人员看到也能明白的中文描述
这里说一下后端解析无非就是空格切分一个个判断了
前端js解析在这里 CronExpParserUtil.js
直接上代码
dependencygroupIdorg.apache.commons/groupIdartifactIdcommons-lang3/artifactIdversion3.8.1/version
/dependency WeekEnum.java
package com.example.wftspringbootdemo.test.utils;public enum WeekEnum {SECONDS(1, 星期天, Sunday ), MONDAY(2, 星期一, Monday ), TUESDAY(3, 星期二, Tuesday ), WEDNESDAY(4,星期三, Wednesday ), THURSDAY(5, 星期四,Thursday ), FRIDAY(6, 星期五, Friday ), SATURDAY(7, 星期六, Saturday );private String key;private String nameCn;private String nameEn;WeekEnum(String key, String nameCn, String nameEn) {this.key key;this.nameCn nameCn;this.nameEn nameEn;}public static String matchNameCn(String code) {for (WeekEnum m : WeekEnum.values()) {if (m.getKey().equals(code)) {return m.getNameCn();}}return ;}public static String matchNameEn(String code) {for (WeekEnum m : WeekEnum.values()) {if (m.getKey().equals(code)) {return m.getNameEn();}}return ;}public String getKey() {return key;}public void setKey(String key) {this.key key;}public String getNameCn() {return nameCn;}public void setNameCn(String nameCn) {this.nameCn nameCn;}public String getNameEn() {return nameEn;}public void setNameEn(String nameEn) {this.nameEn nameEn;}}CronExpParseUtil.java
package com.example.wftspringbootdemo.test.utils;import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;public class CronExpParserUtil {protected final static String[] CRON_TIME_CN new String[]{秒, 分钟, 小时, 天, 月,周, 年};private final static Integer HOURS 24;private final static Integer TIMESCALE 60;/*** 主要解析 斜杆 /表示起始时间开始触发然后每隔固定时间触发一次。* 范围值开始值 - 间隔值 范围内最后执行的值* 例如在Hourss域使用3/4,则意味着从第3小时到243-423小时范围内第3小时开始触发第一次然后每隔4小时即711151923小时等分别触发一次。* 例如在Minutes域使用5/20,则意味着从第5分钟到605-2045分范围内第5分钟开始触发第一次然后每隔20分钟即2545分钟等分别触发一次。* 例如在Seconds域使用8/10,则意味着从第8秒到608-1058秒范围内第8秒开始触发第一次然后每隔10秒即1828384858秒等分别触发一次。* ** 对于 *表示匹配该域的任意值。例如在Minutes域使用*, 即表示每分钟都会触发事件。* 对于问号 ?只能用在DayofMonth和DayofWeek两个域其作用为不指定* 对于 -表示范围。例如在Minutes域使用5-20表示从5分到20分钟每分钟触发一次。直接进行拼接* 对于逗号 ,表示列出枚举值。例如在Minutes域使用5,20 则意味着在5和20分每分钟触发一次。* 对于L表示最后只能出现在DayofWeek和DayofMonth域。* 如果出现在DayofMonth域只能使用L表示当月最后一天* 如果在DayofWeek域* 使用数字1-7或L和7的作用一样表示每周的最后一天周六比如数字5表示每周4 7或L表示每周六* 使用数字1-7结合L表示当月最后一周的周几比如5L 表示在最后的一周的周四 3L 表示最后一周的周二* 对于#: 用于确定每个月第几个星期几只能出现在DayofMonth域。* 例如 4#2 表示某月的第二个星期三4表示星期三2表示第二周;* “6#3”表示本月第三周的星期五6表示星期五3表示第三周;* “2#1”表示本月第一周的星期一;* “4#5”表示第五周的星期三。** param cronExp* param cronTimeArr* return*/public static String translateToChinese(String cronExp, String[] cronTimeArr) {if (cronExp null || cronExp.length() 1) {return cron表达式为空;}String[] tmpCorns cronExp.split( );StringBuffer sBuffer new StringBuffer();if (tmpCorns.length 6 || tmpCorns.length 7) {if (tmpCorns.length 7) {//解析年 YearString year tmpCorns[6];if((!year.equals(*) !year.equals(?))){sBuffer.append(year).append(cronTimeArr[6]);}}//解析月 Month 主要解析 /String months tmpCorns[4];if (!months.equals(*) !months.equals(?)) {if (months.contains(/)) {sBuffer.append(从).append(months.split(/)[0]).append(号开始).append(,每).append(months.split(/)[1]).append(cronTimeArr[4]);} else {sBuffer.append(每年).append(months).append(cronTimeArr[4]);}}//解析周 DayofWeek 主要解析 , - 1~7/L 1L~7LString dayofWeek tmpCorns[5];if (!dayofWeek.equals(*) !dayofWeek.equals(?)) {if (dayofWeek.contains(,)) {// 多个数字逗号隔开sBuffer.append(每周的第).append(dayofWeek).append(cronTimeArr[3]);} else if (dayofWeek.contains(L) dayofWeek.length() NumberUtils.INTEGER_ONE) {// 1L-7LString weekNum dayofWeek.split(L)[0];String weekName judgeWeek(weekNum);sBuffer.append(每月的最后一周的);sBuffer.append(weekName);} else if(dayofWeek.contains(-)) {String[] splitWeek dayofWeek.split(-);String weekOne judgeWeek(splitWeek[0]);String weekTwo judgeWeek(splitWeek[1]);sBuffer.append(每周的).append(weekOne).append(到).append(weekTwo);} else { // 1-7/Lif(L.equals(dayofWeek)){ // L 转换为7便于识别dayofWeek 7;}int weekNums Integer.parseInt(dayofWeek);if(weekNums 0 || weekNums 7 ){return cron表达式有误dayofWeek数字应为1-7;}sBuffer.append(每周的);String weekName judgeWeek(dayofWeek);sBuffer.append(weekName);}}//解析日 days -- DayofMonth 需要解析的 / # L W// * “6#3”表示本月第三周的星期五6表示星期五3表示第三周;// * “2#1”表示本月第一周的星期一;// * “4#5”表示第五周的星期三。String days tmpCorns[3];if (!days.equals(?) !days.equals(*)) {if (days.contains(/)) {sBuffer.append(每周从第).append(days.split(/)[0]).append(天开始).append(,每).append(days.split(/)[1]).append(cronTimeArr[3]);} else if (L.equals(days)) { // 处理L 每月的最后一天sBuffer.append(每月最后一天);} else if (W.equals(days)) { // 处理W 暂时不懂怎么处理sBuffer.append(days);} else if (days.contains(#)) {String[] splitDays days.split(#);String weekNum splitDays[0]; // 前面数字表示周几String weekOfMonth splitDays[1]; // 后面的数字表示第几周 范围1-4 一个月最多4周String weekName judgeWeek(weekNum);sBuffer.append(每月第).append(weekOfMonth).append(cronTimeArr[5]).append(weekName);} else {sBuffer.append(每月第).append(days).append(cronTimeArr[3]);}} else {if (sBuffer.toString().length() 0 || tmpCorns.length 7) { // 前面没有内容的话拼接下sBuffer.append(每).append(cronTimeArr[3]);}}//解析时 Hours 主要解析 /String hours tmpCorns[2];if (!hours.equals(*)) {if (hours.contains(/)) {// sBuffer.append(内从).append(hours.split(/)[0]).append(时开始).append(,每)// .append(hours.split(/)[1]).append(cronTimeArr[2]);sBuffer.append(appendGapInfo(hours, HOURS, 2));} else {if (!(sBuffer.toString().length() 0)) { // 对于 , 的情况直接拼接sBuffer.append(每天).append(hours).append(cronTimeArr[2]);} else {sBuffer.append(hours).append(cronTimeArr[2]);}}}//解析分 Minutes 主要解析 /String minutes tmpCorns[1];if (!minutes.equals(*)) {if (minutes.contains(/)) {// sBuffer.append(内从第).append(minutes.split(/)[0]).append(分开始).append(,每)// .append(minutes.split(/)[1]).append(cronTimeArr[1]);sBuffer.append(appendGapInfo(minutes, TIMESCALE, 1));} else if (minutes.equals(0)) {} else if (minutes.contains(-)) {String[] splitMinute minutes.split(-);sBuffer.append(splitMinute[0]).append(cronTimeArr[1]).append(到).append(splitMinute[1]).append(cronTimeArr[1]).append(每分钟);} else {sBuffer.append(minutes).append(cronTimeArr[1]);}}//解析秒 Seconds 主要解析 /String seconds tmpCorns[0];if (!seconds.equals(*)) {if (seconds.contains(/)) {// sBuffer.append(内从第).append(seconds.split(/)[0]).append(秒开始).append(,每)// .append(seconds.split(/)[0]).append(cronTimeArr[0]);sBuffer.append(appendGapInfo(seconds, TIMESCALE, 0));} else if (!seconds.equals(0)) {sBuffer.append(seconds).append(cronTimeArr[0]);}}if (sBuffer.toString().length() 0) {sBuffer.append(执行一次);} else {sBuffer.append(表达式中文转换异常);}}return sBuffer.toString();}public static String judgeWeek(String weekNum){String weekName WeekEnum.matchNameCn(String.valueOf(weekNum));int weekNums Integer.parseInt(weekNum);if(weekNums 0 || weekNums 7 ){return cron表达式有误dayofWeek 数字应为1-7;}return StringUtils.isNotEmpty(weekName) ? weekName : String.valueOf(weekNum);}private static String appendGapInfo(String time, int rangeNum, int index){StringBuffer sBufferTemp new StringBuffer();String[] splitTime time.split(/);String startNum splitTime[0];String gapNum splitTime[1];int endNum rangeNum Integer.parseInt(startNum) - Integer.parseInt(gapNum);String endStr String.valueOf(endNum);String timeUnit CRON_TIME_CN[index];sBufferTemp.append(从).append(startNum).append(timeUnit).append(开始).append(到).append(endStr).append(timeUnit).append(范围内).append(,每隔).append(gapNum).append(timeUnit);return sBufferTemp.toString();}public static void main(String[] args) {
// CronExpParserUtil cronExpParserUtil new CronExpParserUtil();// 0 0 2 1 * ? * 表示在每月的1日的凌晨2点// String cronExpression 0 0 0 * * ? *;String cronExpression 3 59 * * * ? *;
// String cronExpression 0 0 6,14,20 * * ? *;System.out.println(cronExpression);System.out.println(CronExpParserUtil.translateToChinese(cronExpression, CRON_TIME_CN) ---);}
}