首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript cron到人类可读的翻译程序

Javascript cron到人类可读的翻译程序
EN

Code Review用户
提问于 2019-02-19 09:55:36
回答 1查看 3.7K关注 0票数 10

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

因为我的网页的未来用户并不都熟悉CRON表达式,所以我编写了一个脚本,将其转换为人类可读的时间表达式。

理解代码背后的逻辑的一些重要信息:

  • 在我的GitLab实例中,"7“不用作"Sunday”的别名。
  • 不考虑时区(...yet)。我现在认为所有的CRON表达式都是UTC时代的。
  • 时间以24小时格式表示(所以晚上11:23是23h23)
  • 我们启动的管道需要很长时间才能完全执行,这就是为什么我们不允许CRON表达式的第一个数字是*

一些cron到string转换的示例:

0 4***→“每天运行04小时”“023**0→”在星期日的23时运行“041**→”在每个月的第一天运行于04小时。

代码

代码语言:javascript
复制
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;
}

问题

如何优化这段代码?

附加信息

  • 这个方法是一个Vue.JS组件的一部分,所以如果我忘记将一些特定于Vue的内容翻译成,我很抱歉。
  • 我还没有实现代码,以防管道在给定的一周/月天数上运行,而这些天数是以逗号分隔的一组数字提供的。
EN

回答 1

Code Review用户

发布于 2019-02-19 12:06:17

你做了很多测试。如果您实现了几个包含不同值的对象,并且只显示这些值,则会更简单。

您必须完成足够的对象来覆盖所有情况,但是这样可以将测试限制在最低限度。

例子:

代码语言:javascript
复制
// 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]];
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/213790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档