获取日历计划格式的延迟

时间:2017-03-07 02:25:26

标签: java calendar cron logic

我正在开发一个允许用户输入遵循类似于cron格式的任务的项目。目前,我需要能够确定下次运行任务的时间,并获得该时间之前的秒数。以下是使用格式和预期结果的几个示例。

Format: (second) (minute) (hour) (day) (month)
          0-59     0-59    0-23   1-31  1-12

(##): States the exact value for the parameter
(*): Accepts all values (effectively ignores the parameter)

Step Modifier (/##): Considers all whole number multiples of ##

30 * * * * -> Runs a task every minute when second = 30
0 /5 * * * -> Runs a task every 5 minutes (at 0, 5, 10, etc.) when second = 0
13 /15 /2 * * -> Runs a task every 15 minutes when seconds = 13 and hour is even

以下是我需要做的几个解析这个问题的例子。

Example time: July 6th, 5:34:12 (24 hour)
In modified format: 12 34 5 6 7

30 * * * * -> returns 18 (next task runs at 5:34:30)
0 /5 * * * -> returns 48 (next task runs at 5:35:00)
13 /15 /2 * * -> returns 1561 (next task runs at 6:00:13)

我尝试了一系列不同的方法,甚至把它带给了我的导师和其他学生,但是没有人能够设计出一个解决方案。编程很容易,但它是逃避我的逻辑。如果有人可以提出建议,我将非常感激。

我唯一想要使用的库是java.util.Calendar,只需获取当前时间,然后使用Calendar.getInstance().SECONDS或其他时间单位。

1 个答案:

答案 0 :(得分:0)

简单策略:

  • 将计划中的步骤值和通配符转换为列表,例如0 0 /6 1 *变为0 0 0,5,11,17,23 1 1,2,3,4,5,6,7,8,9,10,11,12
  • 将新日期初始化为现在。
  • 月份是否与计划的月份相匹配?如果没有,请将日期的月份增加,直到匹配为止。
  • 然后检查一天;它是否符合计划的日期之一?如果没有,请将其增加直至匹配。
  • 然后查看小时......
  • 依此类推,直到整个日期与日程安排相符。
  • 然后从该匹配日期中减去当前日期以获得延迟。