4

我正在寻找 java 中的 cron 表达式库。可以解析 cron 表达式并返回触发器的未来触发时间的东西。

API就行了。

    CronExpression cronExpression = new CronExpression("0 30 4 * * *");
    List<Date> fireTimes = cronExpression.getFireTimes(todaysDate, nextWeekDate);

我不想使用像石英这样复杂的东西。目的是基本上像正则表达式一样使用 cron 来进行计时。就这样。我不想要后台调度程序。

我尝试使用谷歌搜索,但找不到任何非常有用的东西。任何建议,将不胜感激。

问候, 普吉

PS - 我看着使用石英的 CronExpression 类。不是很有帮助 - 未能通过一些测试。

4

4 回答 4

3

您绝对可以使用cron4j进行 cron 表达和调度。

您也可能会发现chirag的这篇文章很有趣,

cronTrigger.getExpressionSummary()
Example:

    CronTrigger t = new CronTrigger();
    t.setCronExpression("0 30 10-13 ? * WED,FRI");
    System.out.println(""+t.getExpressionSummary());
Output:

seconds: 0
minutes: 30
hours: 10,11,12,13
daysOfMonth: ?
months: *
daysOfWeek: 4,6
lastdayOfWeek: false
nearestWeekday: false
NthDayOfWeek: 0
lastdayOfMonth: false
years: *
于 2013-11-05T03:25:36.273 回答
2

听起来cron-utils可能对您有用。不是调度程序。提供处理 cron 定义并返回给定 DateTime 的最后/下一个执行的方法。

这是来自文档的片段:

CronDefinition cronDefinition = CronDefinitionBuilder.instanceDefinitionFor(QUARTZ);
CronParser parser = new CronParser(cronDefinition);

//Get date for last execution
DateTime now = DateTime.now();
ExecutionTime executionTime = ExecutionTime.forCron(parser.parse("* * * * * * *"));
DateTime lastExecution = executionTime.lastExecution(now));

//Get date for next execution
DateTime nextExecution = executionTime.nextExecution(now));

//Time from last execution
Duration timeFromLastExecution = executionTime.timeFromLastExecution(now);

//Time to next execution
Duration timeToNextExecution = executionTime.timeToNextExecution(now);
于 2015-10-20T20:46:54.647 回答
1

我能够使用石英上的虚拟触发器解决问题。我没有安排和作业等,只是使用触发器 api 来计算作业应该基于 cron 表达式触发的所有时间。

最好的,普吉

    OperableTrigger trigger = (OperableTrigger)TriggerBuilder
            .newTrigger()
            .withIdentity("trigger1", "group1")
            .withSchedule(
                    SimpleScheduleBuilder.simpleSchedule()
                            .withIntervalInSeconds(5).repeatForever()
            )
            .build();

    Date startDate = new Date(); Date endDate = new Date(startDate.getTime() + 1000000);
    List<Date> dateList = TriggerUtils.computeFireTimesBetween(trigger, new BaseCalendar(), startDate, endDate);

    System.out.println("******Times**********");
    for(Date date : dateList) {
        System.out.println(date.toString());
    }
    System.out.println("*********************");
于 2013-11-05T04:10:58.367 回答
0

如果这对其他人也有帮助,我尝试了其他选项,但对任何选项都不满意,最后为此目的编写了我自己的非常小的库,crony。它在 maven-central 上可用。

您想要的代码将是裙带:

Cron cronExpression = Cron.parseCronString("0 30 4 * * *").get();
Stream<ZonedDateTime> fireTimes = CronExecution
    .getNextExecutionDates(cron, todaysDate)
    .takeUntil(d -> d.isAfter(nextWeekDate));
于 2016-04-13T06:50:48.400 回答