吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 516|回复: 6
收起左侧

[求助] 根据时间等参数转换为Cron表达式的Helper

  [复制链接]
尘缘丶 发表于 2024-11-19 22:48
在网上找了好久只看到有大佬写解析Cron表达式的代码
但未看到有将年、月、日、时、分、秒、周等参数转换为Cron表达式并校验合法性的代码
希望大佬们指教一下哪里能看到相关代码,不胜感激,java、C#等面向对象语言均可

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Ashtareve 发表于 2024-11-19 22:55
这种功能直接找 AI 就行了啊
[Java] 纯文本查看 复制代码
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class CronExpressionGenerator {

    public static String generateCronExpression(int year, int month, int dayOfMonth, int hour, int minute, int second, int dayOfWeek) {
        // Cron表达式支持的日期范围是1970年1月1日以后
        if (year < 1970) {
            throw new IllegalArgumentException("Year must be greater than or equal to 1970");
        }

        // 校验星期几的范围
        if (dayOfWeek < 1 || dayOfWeek > 7) {
            throw new IllegalArgumentException("DayOfWeek must be between 1 and 7");
        }

        // 将给定的时间信息转换为Date对象
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month - 1, dayOfMonth, hour, minute, second);
        Date date = calendar.getTime();

        // 使用SimpleDateFormat格式化日期,得到CRON表达式中的年月日时分秒部分
        SimpleDateFormat dateFormat = new SimpleDateFormat("ss mm HH dd MM ? yyyy");
        String cronExpression = dateFormat.format(date);

        // 将星期几部分替换为给定的dayOfWeek
        cronExpression = cronExpression.replace("?", String.valueOf(dayOfWeek));

        return cronExpression;
    }

    public static void main(String[] args) {
        // 示例:生成2023年11月15日10点30分每秒执行一次的CRON表达式
        String cronExpression = generateCronExpression(2023, 11, 15, 10, 30, 0, 3); // 星期三
        System.out.println(cronExpression); // 输出:0 30 10 15 11 ? 2023
    }
}


[Java] 纯文本查看 复制代码
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;

public class CronExpressionValidator {

    private static final List<String> ALLOWED_SPECIAL_CHARS = Arrays.asList(",", "-", "*", "/", "?", "L", "W", "#");
    private static final String CRON_PATTERN = "^(\\*|(\\d+|-\\d+\\/\\d+|\\d+\\-\\d+|\\d+L|\\d+W|\\d+#\\d+)){1,5} \\*(\\*|(\\d+|-\\d+\\/\\d+|\\d+\\-\\d+|\\d+L|\\d+W|\\d+#\\d+)){1,5} \\*(\\*|(\\d+|-\\d+\\/\\d+|\\d+\\-\\d+|\\d+L|\\d+W|\\d+#\\d+)){1,5} \\*|(\\d+|-\\d+\\/\\d+|\\d+\\-\\d+|\\d+L|\\d+W|\\d+#\\d+)){1,2} \\? (\\*|(\\d+|\\d{2}))$";

    public static boolean isValidCronExpression(String cronExpression) {
        // 空字符串或null直接返回false
        if (cronExpression == null || cronExpression.isEmpty()) {
            return false;
        }

        // 检查每个字段的特殊字符是否合法
        String[] fields = cronExpression.split(" ");
        if (fields.length != 6 && fields.length != 7) {
            return false;
        }

        for (String field : fields) {
            for (char c : field.toCharArray()) {
                if (!Character.isDigit(c) && !ALLOWED_SPECIAL_CHARS.contains(String.valueOf(c))) {
                    return false;
                }
            }
        }

        // 使用正则表达式进行校验
        return Pattern.matches(CRON_PATTERN, cronExpression);
    }

    public static void main(String[] args) {
        String validCron = "0 0 12 * * ? *";
        String invalidCron = "0 0 12 * * ?";
        System.out.println(validCron + ": " + isValidCronExpression(validCron));
        System.out.println(invalidCron + ": " + isValidCronExpression(invalidCron));
    }
}
 楼主| 尘缘丶 发表于 2024-11-19 23:04
Ashtareve 发表于 2024-11-19 22:55
这种功能直接找 AI 就行了啊
[mw_shl_code=java,true]import java.text.SimpleDateFormat;
import java.u ...

AI写的不太完整且有很多纰漏,不过还是感谢大佬了
Jone2008 发表于 2024-11-20 07:29
kenkenss 发表于 2024-11-20 08:36
AI写的就可以借鉴
suzuki541 发表于 2024-11-20 10:36
用JAVA写的代码,你复制试一下

import java.util.regex.Pattern;

public class CronExpressionGenerator {

    public static String generateCronExpression(Integer year, Integer month, Integer day, Integer hour, Integer minute, Integer second, Integer weekday) {
        StringBuilder cronParts = new StringBuilder();

        if (second!= null) {
            if (second < 0 || second > 59) {
                throw new IllegalArgumentException("Second must be between 0 and 59");
            }
            cronParts.append(second).append(" ");
        } else {
            cronParts.append("* ");
        }

        if (minute!= null) {
            if (minute < 0 || minute > 59) {
                throw new IllegalArgumentException("Minute must be between 0 and 59");
            }
            cronParts.append(minute).append(" ");
        } else {
            cronParts.append("* ");
        }

        if (hour!= null) {
            if (hour < 0 || hour > 23) {
                throw new IllegalArgumentException("Hour must be between 0 and 23");
            }
            cronParts.append(hour).append(" ");
        } else {
            cronParts.append("* ");
        }

        if (day!= null) {
            if (day < 1 || day > 31) {
                throw new IllegalArgumentException("Day must be between 1 and 31");
            }
            cronParts.append(day).append(" ");
        } else {
            cronParts.append("* ");
        }

        if (month!= null) {
            if (month < 1 || month > 12) {
                throw new IllegalArgumentException("Month must be between 1 and 12");
            }
            cronParts.append(month).append(" ");
        } else {
            cronParts.append("* ");
        }

        if (year!= null) {
            cronParts.append(year).append(" ");
        } else {
            cronParts.append("* ");
        }

        if (weekday!= null) {
            if (weekday < 0 || weekday > 6) {
                throw new IllegalArgumentException("Weekday must be between 0 and 6");
            }
            cronParts.append(weekday).append(" ");
        } else {
            cronParts.append("* ");
        }

        return cronParts.toString().trim();
    }

    public static boolean validateCronExpression(String cronExpression) {
        Pattern pattern = Pattern.compile("^((\\*|([0-9]|[1-5][0-9])) (\\*|([0-9]|[1-5][0-9])) (\\*|([0-9]|[1-5][0-9])) (\\*|([1-3][0-1])) (\\*|([1-12])) (\\*|([0-9]+)))$");
        return pattern.matcher(cronExpression).matches();
    }

    public static void main(String[] args) {
        Integer year = 2024;
        Integer month = 11;
        Integer day = 20;
        Integer hour = 14;
        Integer minute = 30;
        Integer second = 0;
        Integer weekday = 3;

        try {
            String cronExpr = generateCronExpression(year, month, day, hour, minute, second, weekday);
            System.out.println("Generated Cron Expression: " + cronExpr);

            if (validateCronExpression(cronExpr)) {
                System.out.println("Cron Expression is valid.");
            } else {
                System.out.println("Cron Expression is invalid.");
            }
        } catch (IllegalArgumentException e) {
            System.out.println("Error: " + e.getMessage());
        }
    }
}
dylanmao 发表于 2024-11-20 11:00
去参考下quartz的代码,里面有操作的
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-5 06:20

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表