5

在 Spring 中,我可以使用以下命令获取 nextExecution 时间:

final CronSequenceGenerator generator = new CronSequenceGenerator(cronExpression);
final Date nextExecutionDate = generator.next(new Date());

但是如何从 cron 表达式中获取最后执行时间呢?

4

1 回答 1

0

它使用二进制搜索来查找最后执行时间。

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;

import java.time.Duration;
import java.time.ZonedDateTime;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import org.junit.jupiter.api.Test;
import org.springframework.scheduling.support.CronExpression;

public class CronTest {

    @Test
    void cronTest() {
        CronExpression expression = CronExpression.parse("1 0/10 * * * ?");
        ZonedDateTime nextTime = expression.next(ZonedDateTime.now());
        assertNotNull(nextTime);
        ZonedDateTime prevTime = getPrevTime(expression, nextTime, nextTime.minusDays(1));
        assertEquals(nextTime.minusMinutes(10), prevTime);
    }

    private ZonedDateTime getPrevTime(CronExpression expression, ZonedDateTime nextTime, ZonedDateTime mayPrevTime) {
        ZonedDateTime start = mayPrevTime;
        ZonedDateTime end = nextTime;
        while (start.isBefore(end)) {
            ZonedDateTime middle = end.minusSeconds(
                TimeUnit.MILLISECONDS.toSeconds(Duration.between(start, end).toMillis() / 2));
            ZonedDateTime tmpNextTime = expression.next(middle);
            if (Objects.equals(tmpNextTime, nextTime)) {
                end = middle.minusSeconds(1);
            } else {
                start = middle.plusSeconds(1);
            }
        }
        return start;
    }
}
于 2021-10-04T11:36:36.093 回答