2017-03-07 93 views
0

我正在开发一个项目,允许用户输入一个类似于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或其他时间单位。

回答

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
  • 将一个新日期初始化为现在。
  • 该月份是否与计划的月份相符?如果不是,则增加日期的月份直到它匹配。
  • 然后检查一天;它是否与日程安排的其中一天相匹配?如果不是,则增加它直到它匹配。
  • 然后检查小时...
  • 依此类推,直到整个日期与日程安排匹配。
  • 然后从该匹配日期减去当前日期以获得延迟。
+0

过了一段时间,我真的放弃了它,从未打算再次回来,因为我再次打开它。与此有关的问题是重叠 - 如果时间表需要大约一个小时;此方法失败。由于如上所述的阶跃调节器,这变得更加困难。不幸的是,这远非一个简单的策略。 –

+0

@JayCastell我已经更新了我的答案,以帮助您使用步骤值。如果你遵循我的策略,我不相信重叠是一个问题。但也许我错过了一些东西,你可以举一个例子,说明这会失败。 –