首页 > 其他分享 >cron表达式翻译中文

cron表达式翻译中文

时间:2024-12-30 09:53:55浏览次数:6  
标签:中文 String split cron field 表达式 put append result

点击查看代码
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;


public class CronUtil {

    private static Map<String, String> monthMap = new HashMap<>();
    private static Map<String, String> weekMap = new HashMap<>();
    private static Map<Character, String> weekDayMap = new HashMap<>();
    private static Map<Integer, String> nameMap = new HashMap<>();
    private static Map<Integer, String> eMap = new HashMap<>();

    private static final String COMMA = ",";
    private static final String STAR = "*";
    private static final String LAST = "L";
    private static final String UNDEFINED = "?";
    private static final String ZERO = "0";

    private static final Integer YEAR = 6;
    private static final Integer WEEK = 5;
    private static final Integer MONTH = 4;
    private static final Integer DAY = 3;
    private static final Integer HOUR = 2;
    private static final Integer MINUTE = 1;
    private static final Integer SECOND = 0;

    private static final String E_YEAR = "每年";
    private static final String E_WEEK = "每周";
    private static final String E_MONTH = "每月";
    private static final String E_DAY = "每日";
    private static final String E_HOUR = "每时";
    private static final String E_MINUTE = "每分";
    private static final String E_SECOND = "每秒";

    static {
        monthMap.put("JAN", "1月");
        monthMap.put("FEB", "2月");
        monthMap.put("MAR", "3月");
        monthMap.put("APR", "4月");
        monthMap.put("MAY", "5月");
        monthMap.put("JUN", "6月");
        monthMap.put("JUL", "7月");
        monthMap.put("AUG", "8月");
        monthMap.put("SEP", "9月");
        monthMap.put("OCT", "10月");
        monthMap.put("NOV", "11月");
        monthMap.put("DEC", "12月");
        weekMap.put("MON", "星期一");
        weekMap.put("TUE", "星期二");
        weekMap.put("WED", "星期三");
        weekMap.put("THU", "星期四");
        weekMap.put("FRI", "星期五");
        weekMap.put("SAT", "星期六");
        weekMap.put("SUN", "星期日");
        weekDayMap.put('1', "星期日");
        weekDayMap.put('2', "星期一");
        weekDayMap.put('3', "星期二");
        weekDayMap.put('4', "星期三");
        weekDayMap.put('5', "星期四");
        weekDayMap.put('6', "星期五");
        weekDayMap.put('7', "星期六");
        nameMap.put(SECOND, "秒");
        nameMap.put(MINUTE, "分");
        nameMap.put(HOUR, "时");
        nameMap.put(DAY, "日");
        nameMap.put(MONTH, "月");
        nameMap.put(WEEK, "星期");
        nameMap.put(YEAR, "年");
        eMap.put(SECOND, E_SECOND);
        eMap.put(MINUTE, E_MINUTE);
        eMap.put(HOUR, E_HOUR);
        eMap.put(DAY, E_DAY);
        eMap.put(MONTH, E_MONTH);
        eMap.put(WEEK, E_WEEK);
        eMap.put(YEAR, E_YEAR);
    }

    public static String translateCron(String cron) {
        String[] fields = cron.split(" ");
        if (fields.length < 6 || fields.length > 7) {
            throw new UnsupportedOperationException("无效的cron表达式");
        }
        StringBuilder result = new StringBuilder();


        if (fields.length == 7) {
            parseYear(fields[6], result);
        }

        parseMonth(fields[4], result);
        parseWeek(fields[5], result);
        boolean dayFlag = (STAR.equals(fields[5]) || UNDEFINED.equals(fields[5])) && (STAR.equals(fields[4]) || UNDEFINED.equals(fields[4]));
        parseDay(fields[3], dayFlag, result);

        boolean hourFlag = (STAR.equals(fields[3]) || UNDEFINED.equals(fields[3])) && (STAR.equals(fields[4]) || UNDEFINED.equals(fields[4]));
        parseHour(fields[2], hourFlag, result);

        boolean minuteFlag = STAR.equals(fields[2]) || UNDEFINED.equals(fields[2]);
        parseMinute(fields[1], minuteFlag, result);

        boolean secondFlag = STAR.equals(fields[1]) || UNDEFINED.equals(fields[1]);
        parseSecond(fields[0], secondFlag, result);

        result.append("执行一次");
        return result.toString();
    }


    public static void parseYear(String field, StringBuilder result) {
        if (!UNDEFINED.equals(field) && !STAR.equals(field)) {
            result.append(field).append(nameMap.get(YEAR));
        }
    }

    public static void parseMonth(String field, StringBuilder result) {
        if (!UNDEFINED.equals(field) && !STAR.equals(field)) {
            if (result.length() == 0) {
                result.append(E_YEAR);
            }
            if (monthMap.containsKey(field)) {
                result.append(monthMap.get(field));
            } else if (field.contains("-")) {
                String[] split = field.split("-");
                if (monthMap.containsKey(split[0])) {
                    result.append(monthMap.get(split[0])).append("至").append(monthMap.get(split[1]));
                } else {
                    result.append(split[0] + nameMap.get(MONTH)).append("至").append(split[1] + nameMap.get(MONTH));
                }
            } else {
                result.append(field).append(nameMap.get(MONTH));
            }
        }
    }

    public static void parseWeek(String field, StringBuilder result) {
        if (!UNDEFINED.equals(field) && !STAR.equals(field)) {
            if (result.length() == 0 && !field.contains(LAST) && field.contains("#")) {
                result.append(E_WEEK);
            }
            if (weekMap.containsKey(field)) {
                result.append(weekMap.get(field));
            } else if (field.contains("-")) {
                String[] split = field.split("-");
                if (weekMap.containsKey(split[0])) {
                    result.append(weekMap.get(split[0])).append("至").append(weekMap.get(split[1]));
                } else {
                    result.append(weekDayMap.get(split[0])).append("至").append(weekDayMap.get(split[1]));
                }
            } else if (field.contains(LAST)) {
                result.append(E_MONTH);
                result.append("最后一个").append(weekDayMap.get(field.charAt(0)));
            } else if (field.contains("#")) {
                String[] split = field.split("#");
                result.append(E_MONTH);
                result.append("第" + split[1] + "个").append(weekDayMap.get(field.charAt(0)));
            } else {
                result.append(weekDayMap.get(field));
            }
        }
    }

    public static void parseDay(String field, boolean flag, StringBuilder result) {
        if (!UNDEFINED.equals(field) && !STAR.equals(field)) {
            if (result.length() == 0 || flag) {
                result.append(E_MONTH);
            }
            if (field.equals(LAST)) {
                result.append("最后一天");
            } else if (field.contains("-")) {
                String[] split = field.split("-");
                result.append(split[0] + nameMap.get(DAY)).append("至").append(split[1] + nameMap.get(DAY));
            } else if (field.contains(COMMA)) {
                String[] split = field.split(COMMA);
                String collect = Arrays.stream(split).map(o -> o + nameMap.get(DAY)).collect(Collectors.joining("、"));
                result.append(collect);
            } else {
                result.append(field).append(nameMap.get(DAY));
            }
        }
    }

    private static void parseHour(String field, boolean flag, StringBuilder result) {
        if (!UNDEFINED.equals(field) && !STAR.equals(field)) {
            if (result.length() == 0 || flag) {
                result.append(E_DAY);
            }
            if (field.contains("-")) {
                String[] split = field.split("-");
                result.append("从").append(hour2Cn(Integer.valueOf(split[0]))).append("至").append(hour2Cn(Integer.valueOf(split[1])));
            } else if (field.contains("/")) {
                String[] split = field.split("/");
                result.append("从").append(hour2Cn(Integer.valueOf(split[0]))).append("每").append(split[1]).append(nameMap.get(HOUR));
            } else if (field.contains(COMMA)) {
                String[] split = field.split(COMMA);
                String collect = Arrays.stream(split).map(o -> hour2Cn(Integer.valueOf(o))).collect(Collectors.joining("、"));
                result.append(collect);
            } else {
                result.append(hour2Cn(Integer.valueOf(field)));
            }
        }
    }

    private static void parseMinute(String field, boolean flag, StringBuilder result) {
        if (!UNDEFINED.equals(field) && !STAR.equals(field)) {
            if (result.length() == 0 || flag) {
                result.append(E_HOUR);
            }
            if (field.contains("-")) {
                String[] split = field.split("-");
                result.append("从").append(split[0]).append(nameMap.get(MINUTE)).append("至").append(split[1]).append(nameMap.get(MINUTE));
            } else if (field.contains("/")) {
                String[] split = field.split("/");
                if (!ZERO.equals(split[0])) {
                    result.append("从").append(split[0]).append(nameMap.get(MINUTE)).append("开始");
                }
                result.append(",每").append(split[1]).append(nameMap.get(MINUTE));
            } else if (field.contains(COMMA)) {
                String[] split = field.split(COMMA);
                String collect = Arrays.stream(split).map(o -> o + nameMap.get(MINUTE)).collect(Collectors.joining("、"));
                result.append(collect);
            } else if (ZERO.equals(field)) {

            } else {
                result.append(field).append(nameMap.get(MINUTE));
            }
        }
    }

    private static void parseSecond(String field, boolean flag, StringBuilder result) {
        if (!UNDEFINED.equals(field) && !STAR.equals(field)) {
            if (result.length() == 0 || flag) {
                result.append(E_MINUTE);
            }
            if (field.contains("-")) {
                String[] split = field.split("-");
                result.append("从").append(split[0]).append(nameMap.get(SECOND)).append("至").append(split[1]).append(nameMap.get(SECOND));
            } else if (field.contains("/")) {
                String[] split = field.split("/");
                if (!ZERO.equals(split[0])) {
                    result.append("从").append(split[0]).append(nameMap.get(SECOND)).append("开始");
                }
                result.append(",每").append(split[1]).append(nameMap.get(SECOND));
            } else if (field.contains(COMMA)) {
                String[] split = field.split(COMMA);
                String collect = Arrays.stream(split).map(o -> o + nameMap.get(SECOND)).collect(Collectors.joining("、"));
                result.append(collect);
            } else if (ZERO.equals(field)) {
                //不做任何处理
            } else {
                result.append(field).append(nameMap.get(SECOND));
            }
        }
    }

    private static String hour2Cn(Integer value) {
        if (null == value) {
            return "";
        }
        if (value < 24 && value >= 18) {
            return "晚上" + (value - 12) + "点";
        } else if (value > 12 && value < 18) {
            return "下午" + (value - 12) + "点";
        } else if (value == 12) {
            return "中午12点";
        } else if (value < 12 && value >= 6) {
            return "上午" + value + "点";
        } else if (value < 6 && value >= 0) {
            return "凌晨" + value + "点";
        }
        return String.valueOf(value);
    }


    public static void main(String[] args) {
        List<String> crons = Arrays.asList(
                "0 0 10,14,16 * * ?",
                "0 0/30 9-17 * * ?",
                "0 0 12 ? * WED",
                "0 0 12 * * ?",
                "0 15 10 ? * *",
                "0 15 10 * * ? ",
                "0 15 10 * * ? 2005",
                "0 * 14 * * ?",
                "0 0/5 14 * * ?",
                "0 0/5 14,18 * * ?",
                "0 0-5 14 * * ?",
                "0 10,44 14 ? 3 WED"
        );
        crons.forEach(cron -> {
            String s = translateCron(cron);
            System.out.println(s);
        });
    }

}

标签:中文,String,split,cron,field,表达式,put,append,result
From: https://www.cnblogs.com/Honorificabilitudinitatibus/p/18640158

相关文章

  • Gemini 智能体agent功能又更新,现在支持写中文版文献综述了!
    我是娜姐@迪娜学姐,一个SCI医学期刊编辑,探索用AI工具提效论文写作和发表。上次介绍了最新的Geminideepresearch智能体写文献综述的功能,给定一个主题,可以生成一篇2-3000字带完整参考文献来源的文献综述,文献来源都是pubmed、PMC、OA期刊等真实文献。很多读者感兴趣,学员也......
  • GitHub 汉化插件,GitHub 中文化界面安装全教程
    概述GitHub作为全球最大的代码托管平台,拥有庞大的用户群体。对于中文用户来说,如果能将GitHub界面汉化,将大大提高使用体验和工作效率。本文将详细介绍如何通过安装汉化插件,实现GitHub界面的中文化。感谢maboloshi作者的无私奉献.GitHub汉化插件,GitHub中文化界面安装......
  • Python Cookbook(第3版)中文版-PDF免费下载
    PythonCookbook(第3版)中文版-PDF免费下载适读人群:Python程序开发人员、编程爱好者、在校大学生电子版仅供预览,下载后24小时内务必删除,支持正版,喜欢的请购买正版书籍:https://item.jd.com/13897579.htmlPython图书升级版本,Python编程从入门到实践,涵盖Python3.3,包含大量实用Pyt......
  • Python 正则表达式进阶用法:字符集与字符范围详解
    Python正则表达式进阶用法:字符集与字符范围详解正则表达式是文本处理和数据清洗中不可或缺的工具。在前面的学习中,我们已经了解了基本的正则表达式匹配,如匹配单个字符、字符串开始和结束的位置等。今天,我们将进入正则表达式的一个进阶主题:字符集(CharacterSet)和字符范围(Characte......
  • Python 正则表达式进阶用法:边界匹配
    Python正则表达式进阶用法:边界匹配正则表达式是一种强大的工具,用于处理文本中的模式匹配。它广泛应用于文本查找、替换、数据清洗等任务。在学习了正则表达式的基础知识后,掌握更高级的用法将使得正则表达式的应用更加灵活。边界匹配(BoundaryMatching)是正则表达式中的一种重要进......
  • FastStone Capture10.9电脑截图工具中文绿色便携版
    前言FSCapture是一款集图像捕捉、浏览编辑、视频录制等功能于一身的屏幕截图软件,软件具有体积小巧、功能强大、操作简便等优点,其方便的浮动工具条和便捷的快捷键堪称完美结合。截图后的图片编辑与保存选项也特别丰富和方便,内置功能完善的图像编辑器,支持几乎所有主流图片格式,除提......
  • SpringAI人工智能开发框架005---SpringAI文本转语音_语音转文本_音频翻译程序接口编写
    可以看到SpringAi中关于音频的API帮助文档可以去看一下.可以看到帮助文档.这部分功能就是把声音变成文本,以及把文本变成声音.去创建一个项目然后修改一下,仓库,引入sringai的仓库 然后指定一下版本,这里要用java17的版本.然后这里用的api-key这个key,这里配置......
  • 基于Python控制台的中文文本情感分析程序
    以下是一个简单的基于Python控制台的中文文本情感分析程序,使用了snownlp库来进行情感分析。程序功能包括用户输入中文文本并分析其情感倾向(积极或消极)。程序功能简介用户可以输入中文文本。程序使用snownlp库对文本进行情感分析。输出情感得分及其对应的情感分类(如:积极/消极......
  • SOTA简繁中文拼写检查工具:FASPell Chinese Spell Checker 论文
    拼写纠正系列NLP中文拼写检测实现思路NLP中文拼写检测纠正算法整理NLP英文拼写算法,如果提升100W倍的性能?NLP中文拼写检测纠正Paperjava实现中英文拼写检查和错误纠正?可我只会写CRUD啊!一个提升英文单词拼写检测性能1000倍的算法?单词拼写纠正-03-leetcode......
  • NLP 中文拼写检测纠正论文 A Hybrid Approach to Automatic Corpus Generation 代码实
    拼写纠正系列NLP中文拼写检测实现思路NLP中文拼写检测纠正算法整理NLP英文拼写算法,如果提升100W倍的性能?NLP中文拼写检测纠正Paperjava实现中英文拼写检查和错误纠正?可我只会写CRUD啊!一个提升英文单词拼写检测性能1000倍的算法?单词拼写纠正-03-leetcodeedit-d......