我正在开发一个网页,显示来自GitLab实例的所有项目的计划管道。计划时间用CRON表达式表示,即五位数,如下所示:

因为我的网页的未来用户并不都熟悉CRON表达式,所以我编写了一个脚本,将其转换为人类可读的时间表达式。
理解代码背后的逻辑的一些重要信息:
*。0 4***→“每天运行04小时”“023**0→”在星期日的23时运行“041**→”在每个月的第一天运行于04小时。
function convertCronToString(cronExpression) {
var cron = cronExpression.split(" ");
var minutes = cron[0];
var hours = cron[1];
var dayOfMonth = cron[2];
var month = cron[3];
var dayOfWeek = cron[4];
var cronToString = "Runs at ";
// Formatting time if composed of zeros
if (minutes === "0") minutes = "00";
if (hours === "0") hours = "00";
// If it's not past noon add a zero before the hour to make it look like "04h00" instead of "4h00"
else if (hours.length === 1 && hours !== "*") {
hours = "0" + hours;
}
// Our activities do not allow launching pipelines every minute. It won't be processed.
if (minutes === "*") {
cronToString =
"Unreadable cron format. Cron will be displayed in its raw form: " +
cronExpression;
}
cronToString = cronToString + hours + "h" + minutes + " ";
if (dayOfWeek === "0,6") dayOfWeek = "on weekends";
else if (dayOfWeek === "1-5") dayOfWeek = "on weekdays";
else if (dayOfWeek.length === 1) {
if (dayOfWeek === "*" && dayOfMonth === "*") dayOfWeek = "every day ";
else if (dayOfWeek === "*" && dayOfMonth !== "*") {
cronToString = cronToString + "on the " + dayOfMonth;
if (
dayOfMonth === "1" ||
dayOfMonth === "21" ||
dayOfMonth === "31"
) {
cronToString = cronToString + "st ";
} else if (dayOfMonth === "2" || dayOfMonth === "22") {
cronToString = cronToString + "nd ";
} else if (dayOfMonth === "3" || dayOfMonth === "23") {
cronToString = cronToString + "rd ";
} else {
cronToString = cronToString + "th ";
}
cronToString = cronToString + "day of every month";
return cronToString;
} else if (dayOfWeek !== "*" && dayOfMonth === "*") {
switch (parseInt(dayOfWeek)) {
case 0:
dayOfWeek = "on Sundays";
break;
case 1:
dayOfWeek = "on Mondays";
break;
case 2:
dayOfWeek = "on Tuesdays";
break;
case 3:
dayOfWeek = "on Wednesdays";
break;
case 4:
dayOfWeek = "on Thursdays";
break;
case 5:
dayOfWeek = "on Fridays";
break;
case 6:
dayOfWeek = "on Saturdays";
break;
default:
cronToString =
"Unreadable cron format. Cron will be displayed in its raw form: " +
cronExpression;
return cronToString;
}
}
cronToString = cronToString + dayOfWeek + " ";
}
return cronToString;
}如何优化这段代码?
发布于 2019-02-19 12:06:17
你做了很多测试。如果您实现了几个包含不同值的对象,并且只显示这些值,则会更简单。
您必须完成足够的对象来覆盖所有情况,但是这样可以将测试限制在最低限度。
例子:
// I won't print every cases but you got the idea
let dayOfWeekWhenNoMonthIsSpecified = {
'*' : 'every day', '0' : 'on Sundays', '1' : 'on Mondays',
'0,6' : 'on weekends', '1-5' : 'on weekdays'
};
cronToString = "Runs " + dayOfWeekWhenNoMonthIsSpecified[cron[4]];https://codereview.stackexchange.com/questions/213790
复制相似问题