Java将时间转为Cron表达式

package cn.com.baidu.util;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * 将时间转为Cron表达式
 * CBC
 * 2023年10月23日15:37:14
 */
public class CronUtils {

    private static final DateTimeFormatter FORMAT = DateTimeFormatter.ofPattern("ss mm HH dd MM ? yyyy");

    public enum TimeCycle {
        YEAR, MONTH, WEEK, DAY, HOUR, MINUTE, SECOND
    }

    /**
     * 将LocalDateTime转换为cron表达式的字符串。
     * @param dateTime 要转换的时间字符串
     * @param format 要转换的时间格式
     * @return cron表达式
     */
    public static String toCronExpression(String dateTime, String format) {
        LocalDateTime localDate = LocalDateTime.parse(dateTime, DateTimeFormatter.ofPattern(format));
        String date = localDate.format(FORMAT);
        return date;
    }

    /**
     * 将LocalDateTime转换为cron表达式的字符串。
     * @param dateTime 要转换的LocalDateTime
     * @return cron表达式
     */

    public static String toCronExpression(LocalDateTime dateTime) {
        String date = dateTime.format(FORMAT);
        return date;
    }

    /**
     * 将指定的 LocalDateTime 对象转换为 指定周期的 cron 表达式字符串
     * @param dateTime LocalDateTime 对象
     * @param timeCycle 时间周期枚举值
     * @return cron 表达式字符串
     */
    public static String toCronExpression(LocalDateTime dateTime, TimeCycle timeCycle) {
        String cron = null;
        switch (timeCycle) {
            case YEAR:
                cron = String.format("%d %d %d %d %d ? *", dateTime.getSecond(),
                        dateTime.getMinute(), dateTime.getHour(), dateTime.getDayOfMonth(),
                        dateTime.getMonthValue());
                break;
            case MONTH:
                cron = String.format("%d %d %d %d * ? *", dateTime.getSecond(),
                        dateTime.getMinute(), dateTime.getHour(), dateTime.getDayOfMonth());
                break;
            case WEEK:
                cron = String.format("%d %d %d ? * %d *", dateTime.getSecond(),
                        dateTime.getMinute(), dateTime.getHour(), dateTime.getDayOfWeek().getValue() % 7);
                break;
            case DAY:
                cron = String.format("%d %d %d * * ? *", dateTime.getSecond(),
                        dateTime.getMinute(), dateTime.getHour());
                break;
            case HOUR:
                cron = String.format("%d %d * * * ? *", dateTime.getSecond(),
                        dateTime.getMinute());
                break;
            case MINUTE:
                cron = String.format("%d * * * * ? *", dateTime.getSecond());
                break;
            case SECOND:
                cron = "0/1 * * * * ? *";
                break;
            default:
                throw new IllegalArgumentException("Unknown time cycle: " + timeCycle);
        }
        return cron;
    }

    public static void main(String[] args) {
        // 指定时间执行
        System.out.println(toCronExpression("2015年11月11日 10时15分16秒", "yyyy年MM月dd日 HH时mm分ss秒"));
        System.out.println(toCronExpression(LocalDateTime.now()));
        // 每年(这个月的这一天的这个时间执行一次)
        LocalDateTime dateTime = LocalDateTime.of(2023, 3, 30, 23, 45, 5);
        System.out.println(CronUtils.toCronExpression(dateTime, TimeCycle.YEAR));
        // 每月(这一天的这个时间执行一次)
        System.out.println(CronUtils.toCronExpression(dateTime, TimeCycle.MONTH));
        // 每周(这一天的这个时间执行一次)
        System.out.println(CronUtils.toCronExpression(dateTime, TimeCycle.WEEK));
        // 日(每天的23:53:00执行)
        System.out.println(CronUtils.toCronExpression(dateTime, TimeCycle.DAY));
        // 小时(每小时的53分执行)
        System.out.println(CronUtils.toCronExpression(dateTime, TimeCycle.HOUR));
        // 分钟(每分钟的53秒执行)
        System.out.println(CronUtils.toCronExpression(dateTime, TimeCycle.MINUTE));
        // 秒(每秒执行一次)
        System.out.println(CronUtils.toCronExpression(dateTime, TimeCycle.SECOND));
    }

}

16 15 10 11 11 ? 2015
03 16 16 23 10 ? 2023
5 45 23 30 3 ? *
5 45 23 30 * ? *
5 45 23 ? * 4 *
5 45 23 * * ? *
5 45 * * * ? *
5 * * * * ? *
0/1 * * * * ? *

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值