如何从初始 LocalDateTime 和 cron 表达式获取下一个 LocalDateTime?

问题描述 投票:0回答:4

我有一个初始日期和一个 cron 表达式。我怎样才能找到满足这个 cron 表达式的下一个日期?.

    String cronExpresion = "* * * * * *"
    LocalDateTime initial = LocalDateTime.now()
    LocalDateTime next = ?

我尝试了 CronSequenceGenerator 及其 next() 方法,但它使用 java.util.Date,我不希望将 LocalDateTime 转换为 Date,反之亦然。另外,我从几次使用“每 10 秒”这样的 cron 运行得到了不同的结果(两个日期之间的时间)...

有什么想法吗?库?

date cron java-8
4个回答
4
投票

Omnicron (https://github.com/intelie/omnicron) 似乎至少满足您的一些要求:

Cron cron = new Cron("*/5 * * * *");
ZonedDateTime date = ZonedDateTime.now();

System.out.println("Next execution: " + cron.next(date));
System.out.println("Prev execution: " + cron.prev(date));

(Cron::next 和 Cron::prev 接受任何时间值,而不仅仅是 ZonedDateTime。)

除此之外,Omnicron 还可以与 Spring 的 CronSequenceGenerator 兼容(https://github.com/intelie/omnicron/blob/master/src/test/java/net/intelie/omnicron/SpringCompatibilityTest.java )


2
投票

另一个解决方案是使用 spring 的 CronSequenceGenerator

String cronExpresion = "* * * * * *";
Date next = new CronSequenceGenerator().next(new Date());
return LocalDateTime.ofInstant(next.toInstant(), ZoneId.systemDefault());

0
投票

最终 Spring 版本

5.3.0
发布了新版本的 CronExpression,它没有连接到旧的 java time API


0
投票

Java Spring,您可以使用 Spring 框架中的 CronExpression 类。 您可以这样做:

import org.springframework.scheduling.support.CronExpression;

import java.time.LocalDateTime;

public class CronNextExecutionExample {
    public static void main(String[] args) {
        String cronExpression = "0 0 12 * * ?"; // Runs daily at 12:00 PM
        CronExpression cron = CronExpression.parse(cronExpression);
        
        LocalDateTime now = LocalDateTime.now();
        LocalDateTime nextExecution = cron.next(now);
        
        System.out.println("Next execution: " + nextExecution);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.