cron中文翻译工具类

news2024/11/24 15:56:44

实现效果
在这里插入图片描述

/**
 * cron转换中文工具类
 *
 * @author lixuan
 */
public class CronUtil {

    private static final Logger LOGGER = LoggerFactory.getLogger(CronUtil.class);

    /**
     * cron中文表达式
     */
    private static final List<ValueLabelPair> HOUR_LIST = generateValueLabelPairs(0, 23);
    private static final List<ValueLabelPair> MINUTES_LIST = generateValueLabelPairs(0, 59);
    private static final List<ValueLabelPair> DATE_LIST = generateDateValueLabelPairs(1, 31);

    public static String convertToChineseExpression(String cronExpression) {
        String result = "";
        try {
            String[] arr = cronExpression.split(" ");
            int index = -1;
            for (int i = 0; i < arr.length; i++) {
                if ("*".equals(arr[i]) || arr[i].contains("/")) {
                    index = i;
                    break;
                }
            }

            int n;
            String unit;
            if ("*".equals(arr[index])) {
                n = 1;
            } else {
                n = Integer.parseInt(arr[index].split("/")[1]);
            }
            switch (index) {
                case 0:
                    unit = "分";
                    break;
                case 1:
                    unit = "时";
                    break;
                case 2:
                    unit = "天";
                    break;
                case 3:
                    unit = "月";
                    break;
                case 4:
                    unit = "星期";
                    break;
                default:
                    unit = "";
                    break;
            }

            result = "每" + n + unit + "执行。";
            if ("月".equals(unit) || "天".equals(unit)) {
                String specifiedDays = expandDayAsSpecifiedValues(arr[2], DATE_LIST);
                //排序
                specifiedDays = updateSpecified(specifiedDays);
                if (!"".equals(specifiedDays) && !arr[2].contains("/")) {
                    result += "指定日:" + specifiedDays + "。";
                }
            }
            if (!"分".equals(unit) && !"时".equals(unit)) {
                String specifiedHours = expandSpecifiedValues(arr[1], HOUR_LIST);
                //排序
                specifiedHours = updateSpecified(specifiedHours);
                result += "指定时:" + specifiedHours + "。";
            }
            if (!"分".equals(unit)) {
                String specifiedMinutes = expandSpecifiedValues(arr[0], MINUTES_LIST);
                //排序
                specifiedMinutes = updateSpecified(specifiedMinutes);
                result += "指定分:" + specifiedMinutes + "。";
            }
            return result;
        } catch (NumberFormatException | IndexOutOfBoundsException e) {
            LOGGER.error("cron表达式有误");
            return result;
        }
    }

    private static String updateSpecified(String specifiedDays) {
        String specified = "";
        if (StringUtils.isNotBlank(specifiedDays)) {
            List<String> list = new ArrayList<>(List.of(specifiedDays.split("、")));
            Collections.sort(list);
            specified = String.join("、", list);
        }
        return specified;
    }

    private static String expandSpecifiedValues(String value, List<ValueLabelPair> list) {
        if ("*".equals(value)) {
            return "";
        } else if (value.contains(",")) {
            String[] values = value.split(",");
            StringBuilder sb = new StringBuilder();
            for (String v : values) {
                if (v.contains("/")) {
                    String[] range = v.split("/");
                    int start = Integer.parseInt(range[0]);
                    int step = Integer.parseInt(range[1]);
                    for (int i = start; i < list.size(); i += step) {
                        sb.append(list.get(i).getLabel()).append("、");
                    }
                } else if (v.contains("-")) {
                    String[] range = v.split("-");
                    int start = Integer.parseInt(range[0]);
                    int end = Integer.parseInt(range[1]);
                    for (int i = start; i <= end; i++) {
                        sb.append(list.get(i).getLabel()).append("、");
                    }
                } else if ("L".equals(v)) {
                    sb.append(list.get(list.size() - 1).getLabel()).append("、");
                } else {
                    int index = Integer.parseInt(v);
                    sb.append(list.get(index).getLabel()).append("、");
                }
            }
            if (sb.length() > 0) {
                sb.setLength(sb.length() - 1);
            }
            return sb.toString();
        } else if (value.contains("/")) {
            String[] range = value.split("/");
            int start = Integer.parseInt(range[0]);
            int step = Integer.parseInt(range[1]);
            StringBuilder sb = new StringBuilder();
            for (int i = start; i < list.size(); i += step) {
                sb.append(list.get(i).getLabel()).append("、");
            }
            if (sb.length() > 0) {
                sb.setLength(sb.length() - 1);
            }
            return sb.toString();
        } else if (value.contains("-")) {
            String[] range = value.split("-");
            int start = Integer.parseInt(range[0]);
            int end = Integer.parseInt(range[1]);
            StringBuilder sb = new StringBuilder();
            for (int i = start; i <= end; i++) {
                sb.append(list.get(i).getLabel()).append("、");
            }
            if (sb.length() > 0) {
                sb.setLength(sb.length() - 1);
            }
            return sb.toString();
        } else if ("L".equals(value)) {
            return list.get(list.size() - 1).getLabel();
        } else {
            int index = Integer.parseInt(value);
            if (index < list.size()) {
                return list.get(index).getLabel();
            }
        }
        return "";
    }

    private static String expandDayAsSpecifiedValues(String value, List<ValueLabelPair> list) {
        if ("*".equals(value)) {
            return "";
        } else if (value.contains(",")) {
            String[] values = value.split(",");
            StringBuilder sb = new StringBuilder();
            for (String v : values) {
                if (v.contains("/")) {
                    String[] range = v.split("/");
                    int start = Integer.parseInt(range[0]);
                    int step = Integer.parseInt(range[1]);
                    for (int i = start; i <= list.size(); i += step) {
                        sb.append(list.get(i - 1).getLabel()).append("、");
                    }
                } else if (v.contains("-")) {
                    String[] range = v.split("-");
                    int start = Integer.parseInt(range[0]);
                    int end = Integer.parseInt(range[1]);
                    for (int i = start; i <= end; i++) {
                        sb.append(list.get(i - 1).getLabel()).append("、");
                    }
                } else if ("L".equals(v)) {
                    sb.append(list.get(list.size() - 1).getLabel()).append("、");
                } else {
                    int index = Integer.parseInt(v);
                    sb.append(list.get(index - 1).getLabel()).append("、");
                }
            }
            if (sb.length() > 0) {
                sb.setLength(sb.length() - 1);
            }
            return sb.toString();
        } else if (value.contains("/")) {
            String[] range = value.split("/");
            int start = Integer.parseInt(range[0]);
            int step = Integer.parseInt(range[1]);
            StringBuilder sb = new StringBuilder();
            for (int i = start; i <= list.size(); i += step) {
                sb.append(list.get(i - 1).getLabel()).append("、");
            }
            if (sb.length() > 0) {
                sb.setLength(sb.length() - 1);
            }
            return sb.toString();
        } else if (value.contains("-")) {
            String[] range = value.split("-");
            int start = Integer.parseInt(range[0]);
            int end = Integer.parseInt(range[1]);
            StringBuilder sb = new StringBuilder();
            for (int i = start; i <= end; i++) {
                sb.append(list.get(i - 1).getLabel()).append("、");
            }
            if (sb.length() > 0) {
                sb.setLength(sb.length() - 1);
            }
            return sb.toString();
        } else if ("L".equals(value)) {
            return list.get(list.size() - 1).getLabel();
        } else {
            int index = Integer.parseInt(value);
            if (index <= list.size()) {
                return list.get(index - 1).getLabel();
            }
        }
        return "";
    }

    public static List<ValueLabelPair> generateValueLabelPairs(int start, int end) {
        List<ValueLabelPair> valueLabelPairs = new ArrayList<>();
        for (int i = start; i <= end; i++) {
            String value = String.valueOf(i);
            String label = String.format("%02d", i);
            valueLabelPairs.add(new ValueLabelPair(value, label));
        }
        return valueLabelPairs;
    }

    public static List<ValueLabelPair> generateDateValueLabelPairs(int start, int end) {
        List<ValueLabelPair> valueLabelPairs = new ArrayList<>();
        for (int i = start; i <= end; i++) {
            String value = String.valueOf(i);
            String label = String.valueOf(i);
            valueLabelPairs.add(new ValueLabelPair(value, label));
        }
        valueLabelPairs.add(new ValueLabelPair("L", "最后一日"));
        return valueLabelPairs;
    }


    static class ValueLabelPair {
        private final String value;
        private final String label;

        public ValueLabelPair(String value, String label) {
            this.value = value;
            this.label = label;
        }

        public String getValue() {
            return value;
        }

        public String getLabel() {
            return label;
        }

    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/865859.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 Packet Tracer 查看协议数据单元

练习 2.6.2&#xff1a;使用 Packet Tracer 查看协议数据单元 地址表 本练习不包括地址表。 拓扑图 学习目标 捕获从 PC 命令提示符发出的 ping运行模拟并捕获通信研究捕获的通信从 PC 使用 URL 捕获 Web 请求运行模拟并捕获通信研究捕获的通信 简介&#xff1a; Wiresha…

Dynamics 365 实体配置各属性介绍

在主界面中,我们点击设置图标->高级设置->解决方案,即可跳转到解决方案配置页面。 解决方案的存在有两方面价值,一方面是方便我们对系统进行定制,比如新建实体。另一方面则是为了方便我们在不同的环境之间复制修改的内容,也即发布。 解决方案包配置 在解决方案包…

DERT:End-to-End Object Detection with Transformers

文章目录 摘要1、简介2、相关工作2.1、集合预测2.2、Transformer与并行解码2.3、目标检测 3、DETR模型3.1、目标检测集合预测损失3.2、DETR架构 4、实验4.1、与Faster R-CNN的对比4.2、消融4.3、分析4.4、用于全景分割的DETR 5、结论附录 AA.1、初步:多头注意层A.2、损失A.3、详…

广州华锐互动:电力VR安全体验让学员沉浸式感受安全危害

随着科技的不断发展&#xff0c;虚拟现实(VR)技术在电力安全体验中发挥着越来越重要的作用。VR技术可以提供一种沉浸式的体验&#xff0c;使学员更好地理解和掌握电气安全知识&#xff0c;从而减少意外事故的发生。 首先&#xff0c;VR技术可以模拟各种电气事故场景&#xff0…

最大交换(力扣)枚举 JAVA

给定一个非负整数&#xff0c;你至多可以交换一次数字中的任意两位。返回你能得到的最大值。 示例 1 : 输入: 2736 输出: 7236 解释: 交换数字2和数字7。 示例 2 : 输入: 9973 输出: 9973 解释: 不需要交换。 注意: 给定数字的范围是 [0, 10^8] 解题思路&#xff1a; 1、数最…

Figma高效工作秘笈:10个插件助你提效!

Figma插件本质上是遵循特定接口规范开发的小程序,对设计师来说,合理选择和使用Figma插件,可以极大地优化工作流程。不同的插件具有不同的用途,设计师可以根据实际需求选择适合的插件。市面上存在各种各样的Figma插件,初学者可能会不知所措。本文将推荐10款广受设计师欢迎、功能…

[Mongodb 5.0]单机启动

安装完mongodb后&#xff0c;会自动生成下面两个目录(mongod.conf中设定的)&#xff0c;用来存放日志和数据 /var/lib/mongo (数据目录) /var/log/mongodb (日志目录) 要启动一个单机版的mongodb&#xff0c;一般有两种方式&#xff1a; 第一种启动方式&#xff1a;直接使用…

SD NAND FLASH : 什么是pSLC?

一、什么是pSLC pSLC&#xff08;Pseudo-Single Level Cell&#xff09;即伪SLC&#xff0c;是一种将MLC/TLC改为SLC的一种技术&#xff0c;现Nand Flash基本支持此功能&#xff0c;可以通过指令控制MLC进入pSCL模式&#xff0c;存储时在MLC的每个单元中仅存储1bit数据&#x…

传值与传址问题

传值与传址实例 2023年上半年软考真题&#xff1a; 22、设函数foo和hoo的定义如下图所示&#xff0c;在函数foo中调用函数hoo&#xff0c;hoo的第一个参数采用传引用方式(call by reference)&#xff0c;第二个参数传值方式(call by value)&#xff0c;那么函数foo中的print(a…

试用智能编程助手

1 简介 网传有了大模型之后&#xff0c;很多人都要失业了&#xff0c;其中也包括一部分程序员&#xff0c;确实大模型可以减轻开发者的工作量&#xff0c;但是具体到减轻了多少工作量&#xff0c;哪种类型的工作&#xff0c;学习成本&#xff0c;使用成本如何&#xff1f;不捧…

【前端】CSS垂直居中的7种方法

文章目录 line-height绝对定位margin:autoflex绝对定位margin:负值定位transformvertical-align:middledisplay:table-cell思维导图 前文&#xff1a;【前端】CSS水平居中的6种方法_karshey的博客-CSDN博客 有很多相似的部分。 line-height 适用于单行的行内元素设置line-he…

灵眸:2023年上半年中国主要消费领域宏观数据概览报告(附下载)

关于报告的所有内容&#xff0c;公众【营销人星球】获取下载查看 核心观点 2023年上半年中国社会消费品零售总额22.8万化元。2023年上半年中国电商实体商品消费总额达6.1万亿元&#xff0c;同比增长10.8%。2023年上半年中国餐饮、汽车消费均超2万化元&#xff0c;餐饮、金银珠…

【网络层+数据链路层】深入理解IP协议和MAC帧协议的基本原理

文章目录 前言一、IP协议二、MAC帧协议 1.以太网2.以太网帧&#xff08;MAC帧&#xff09;格式报头3.基于协议讲解局域网转发的原理总结 前言 为什么经常将TCP/IP放在一起呢&#xff1f;这是因为IP层的核心工作就是通过IP地址来定位主机的&#xff0c;具有将一个数据报从A主机…

搭建B端产品帮助中心这两点很重要,从客户“帮助中心”出发思考!

一款优质的产品若想要用户体验良好&#xff0c;除了需要客服解答外&#xff0c;一个全面完善的产品帮助中心也是必不可少的&#xff0c;尤其是对于B端产品来说&#xff0c;其重要性自然不言而喻。 产品帮助中心 因为帮助中心是一个产品的重要用户自助服务模块&#xff0c;包括…

华为OD机试真题 Java 实现【跳格子游戏】【2023 B卷 200分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

进销存管理系统(小杨国贸)springboot采购仓库财务java jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 进销存管理系统&#xff08;小杨国贸&#xff09;spri…

SpringBoot 整合Swagger2

一、Swagger简介 Swagger是一套开源工具和规范&#xff0c;用于设计、构建和文档化RESTful Web服务。它允许开发人员定义API的各个方面&#xff0c;并生成易于理解的API文档和交互式API探索界面。同时&#xff0c;Swagger还提供代码生成工具&#xff0c;可自动生成与API交互的客…

公文撰写规范:提升文档质量和专业性

1.拼写和语法检查&#xff1a;仔细检查文档中的拼写错误和语法错误。确保单词的正确拼写&#xff0c;并使用正确的语法结构和标点符号。 2.信息准确性&#xff1a;核对文档中的事实和数据&#xff0c;确保其准确性。确认所有日期、数字和引用的信息是否准确无误。 3.文档结构和…

控制国外各类电液伺服阀放大器

控制通用型不带反馈信号输入的伺服阀放大器&#xff0c;对射流管式电液伺服阀、喷嘴挡板式电液伺服阀及国外各类电液伺服阀进行控制。 通过系统参数有10V和4~20mA输入指令信号选择&#xff1b; 供电电源: 24VDC&#xff08;标准&#xff09; 输出电流&#xff1a;最大可达10…

Kuebernetes资源控制管理

第四阶段 时 间&#xff1a;2023年8月11日 参加人&#xff1a;全班人员 内 容&#xff1a; Kuebernetes资源控制管理 目录 Kubectl命令工具 一、kubectl 命令行的语法 二、kubectl命令列表 三、使用 Kubectl 工具容器资源 &#xff08;一&#xff09;创建Pod &…