一个基于java的CRON表达式工具类

2019-12-16  本文已影响0人  杞梓林

前段时间因为要做一个流式算法框架,其中时间判定部分使用了Cron表达式,顺便写了一个Cron的工具类,用于根据一个时间标签和Cron表达式来返回下一次满足Cron表达式的时间标签。

关于Cron表达式

关于什么是Cron表达式,以及Cron表达式的格式网上资料很多,比如下面两个:
Cron表达式
Cron表达式详细用法

解决的需求

1 根据传入的时间标签和Cron表达式,计算下一次满足Cron表达式的时间标签
2 用简单的时间、单位,生成简单的Cron表达式
public class CronExpressionResolver {

    public static CronExpressionResolver getInstance(String cron) {
        return new CronExpressionResolver(cron);
    }

    private CronExpressionResolver(String cron) {
        this.cron = cron;
    }

    private String cron;


    /**
     * 获得下一个符合Cron表达式的时间
     * @param time time
     * @return next time
     */
    public Date nextDateTime(Date time) {
        CronSequenceGenerator cronSequenceGenerator = new CronSequenceGenerator(cron);
        // currentTime为计算下次时间点的开始时间
        return cronSequenceGenerator.next(time);
    }

    /**
     * 获得下一个符合Cron表达式的时间
     * @param time time
     * @return next time
     */
    public Date nextDateTime(long time) {
        CronSequenceGenerator cronSequenceGenerator = new CronSequenceGenerator(cron);
        // currentTime为计算下次时间点的开始时间
        return cronSequenceGenerator.next(new Date(time));
    }

    /**
     * 获得下一个符合Cron表达式的时间
     * @param time time
     * @return next time
     */
    public long nextLongTime(Date time) {
        CronSequenceGenerator cronSequenceGenerator = new CronSequenceGenerator(cron);
        // currentTime为计算下次时间点的开始时间
        return cronSequenceGenerator.next(time).getTime();
    }

    /**
     * 获得下一个符合Cron表达式的时间
     * @param time time
     * @return next time
     */
    public long nextLongTime(long time) {
        CronSequenceGenerator cronSequenceGenerator = new CronSequenceGenerator(cron);
        // currentTime为计算下次时间点的开始时间
        return cronSequenceGenerator.next(new Date(time)).getTime();
    }

    /**
     * 生成Cron表达式
     * 
     * @param num 数值
     * @param unit 单位:s-秒,m-分,h-小时,d-天,mon-月
     * @return
     */
    public static String timeToCron(int num, String unit) {
        switch (unit){
            case "s": return "0/" + num + " * * * * ?";
            case "m": return "0 0/" + num + " * * * ?";
            case "h": return "0 0 0/" + num + " * * ?";
            case "d": return "0 0 0 1/" + num + " * ?";
            case "mon": return "0 0 0 0 1/" + num + " ?";
            default: return "";
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读