将定时任务cron 解析成中文

在使用定时器 quartz 时,其中的cron 表达式,老板表示作为开发的你能看懂外,其他的非开发同事可能看不懂,要用一个他们能看懂的方式表达出来。

还好我们的项目要求的表达式不是特别的麻烦,所以就写了一个简略的转换为中文的方法

package com.common.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.quartz.CronExpression;

public class CronExpParser
{
    /**
     * 解析corn表达式,生成指定日期的时间序列
     *
     * @param cronExpression cron表达式
     * @param cronDate cron解析日期
     * @param result crom解析时间序列
     * @return 解析成功失败
     */
    public static boolean parser(String cronExpression, String cronDate, List<String> result)
    {
        if (cronExpression == null || cronExpression.length() < 1 || cronDate == null || cronDate.length() < 1)
        {
            return false;
        }
        else
        {
            CronExpression exp = null;
            // 初始化cron表达式解析器
            try
            {
                exp = new CronExpression(cronExpression);
            }
            catch (ParseException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return false;
            }

            // 定义生成时间范围
            // 定义开始时间,前一天的23点59分59秒
            Calendar c = Calendar.getInstance();
            String sStart = cronDate + " 00:00:00";
            SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date dStart = null;
            try
            {
                dStart = sdf.parse(sStart);
            }
            catch (ParseException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            c.setTime(dStart);
            c.add(Calendar.SECOND, -1);
            dStart = c.getTime();

            // 定义结束时间,当天的23点59分59秒
            c.add(Calendar.DATE, 1);
            Date dEnd = c.getTime();

            // 生成时间序列
            java.util.Date dd = dStart;
            dd = exp.getNextValidTimeAfter(dd);
            while ((dd.getTime() >= dStart.getTime()) && (dd.getTime() <= dEnd.getTime()))
            {
                result.add(sdf.format(dd));
                dd = exp.getNextValidTimeAfter(dd);
            }
            exp = null;
        }
        return true;
    }

    public static String translateToChinese(String cronExp)
    {
        if (cronExp == null || cronExp.length() < 1)
        {
            return "cron表达式为空";
        }
        CronExpression exp = null;
        // 初始化cron表达式解析器
        try
        {
            exp = new CronExpression(cronExp);
        }
        catch (ParseException e)
        {
            return "corn表达式不正确";
        }
        String[] tmpCorns = cronExp.split(" ");
        StringBuffer sBuffer = new StringBuffer();
        if(tmpCorns.length == 6)
        {
            //解析月
            if(!tmpCorns[4].equals("*"))
            {
                sBuffer.append(tmpCorns[4]).append("月");
            }
            else
            {
                sBuffer.append("每月");
            }
            //解析周
            if(!tmpCorns[5].equals("*") && !tmpCorns[5].equals("?"))
            {
                char[] tmpArray =  tmpCorns[5].toCharArray();
                for(char tmp:tmpArray)
                {
                    switch (tmp)
                    {
                        case ‘1‘:
                            sBuffer.append("星期天");
                            break;
                        case ‘2‘:
                            sBuffer.append("星期一");
                            break;
                        case ‘3‘:
                            sBuffer.append("星期二");
                            break;
                        case ‘4‘:
                            sBuffer.append("星期三");
                            break;
                        case ‘5‘:
                            sBuffer.append("星期四");
                            break;
                        case ‘6‘:
                            sBuffer.append("星期五");
                            break;
                        case ‘7‘:
                            sBuffer.append("星期六");
                            break;
                        case ‘-‘:
                            sBuffer.append("至");
                            break;
                        default:
                            sBuffer.append(tmp);
                            break;
                    }
                }
            }

            //解析日
            if(!tmpCorns[3].equals("?"))
            {
                if(!tmpCorns[3].equals("*"))
                {
                    sBuffer.append(tmpCorns[3]).append("日");
                }
                else
                {
                    sBuffer.append("每日");
                }
            }

            //解析时
            if(!tmpCorns[2].equals("*"))
            {
                sBuffer.append(tmpCorns[2]).append("时");
            }
            else
            {
                sBuffer.append("每时");
            }

            //解析分
            if(!tmpCorns[1].equals("*"))
            {
                sBuffer.append(tmpCorns[1]).append("分");
            }
            else
            {
                sBuffer.append("每分");
            }

            //解析秒
            if(!tmpCorns[0].equals("*"))
            {
                sBuffer.append(tmpCorns[0]).append("秒");
            }
            else
            {
                sBuffer.append("每秒");
            }
        }

        return sBuffer.toString();

    }

    //测试方法
    public static void main(String[] args)
    {
        String CRON_EXPRESSION = "0 0 3 * * ?";
        // 生成指定日期的CRON时间序列
        String CRON_DATE = "2016-04-26";
        System.out.println(CRON_EXPRESSION);
        System.out.println(CronExpParser.translateToChinese(CRON_EXPRESSION));

        List<String> lTime = new ArrayList<String>();
        if(!CronExpParser.parser(CRON_EXPRESSION, CRON_DATE, lTime)){
         System.out.println("无法生成Cron表达式:日期,"+CRON_DATE+";不符合规则cron表达式:"+CRON_EXPRESSION);
        }
        for(int i=0;i<lTime.size();i++){
         System.out.println(lTime.get(i));
        }

    }
}

执行结果:

0 0 3 * * ?
每月每日3时0分0秒
2016-04-26 03:00:00

  老板说界面也不能直接让她们写表达式,最好是能有直观的感受去选,

于是我设计的界面如下:可以手动修改执行时间,或者可以使用cron表达式界面去修改,执行日期修改时 描述信息也将修改

<tr><td align="right">
执行时间:
</td>
<td>
<input id="cron" class="tr180 td26" value="" name="cron" type="text" onchange="checkCron();"><img src="./images/form/clock.gif" onclick="openCron()">
<div >说明:设置定时器调度的时程表格式 <b>秒</b>(0-59,*) <b>分</b>(0-59,*) <b>时</b>(0-23,*) <b>日</b>(0-31,*,?) <b>月</b>(0-11) <b>周</b>(1-7,*,? 1=SUN) /指数值的增量<br>示例① 0 0 12 * * ? 例② 0 15,16 10 15 * ? 例③ 0 15 10 ? * 2-6</div>

</td>
</tr>
<tr>
<td align="right">
执行时间描述:
</td>
<td>
<div id="cronDesc"></div>
</td>
</tr>

  

用一个 onchange 方法,调用一个 ajax 就可以实现描述的 更新啦

function checkCron()
{
	var datas={
		"cronExp":$("#cron").val()
		};
	$.ajax({
		type: "post",
		url: "/getCronDesc",
		data: datas,
		datatype: "text",
		success:function(data){ //成功的处理函数
				$("#cronDesc").html(data);
		}
	});
}

  而 Cron 表达式的页面效果,找了好久,终于看到想看的东西了。感谢 网友的无私分享,在他的基础之上,我经过修改改成自己需要的了,效果如下。

打开一个新的页面

openWin("../../static/cron/cronindex.htm", 640, 480);

function openWin(url,width,height)
{
	var newwin = window.open(url,"_blank","scrollbars=yes,resizable=yes,toolbar=no,location=no,directories=no,status=no,menubar=no,top=50,left=120,width="+width+",height="+height);
}

在打开的页面上选中值后,关闭子页面,并给父页面的某个表单赋值,调用父页面的某个js 方法

function selCron() {
//获取选中的选择框的值
	var cron = $("#cron").val();
	window.opener.cron.value=cron;
	window.close();
	window.opener.checkCron();
}

(ps: 居然不知道 附件怎么上传,算了,corn 页面我就不写了,自己去找吧)

时间: 2024-11-08 19:49:00

将定时任务cron 解析成中文的相关文章

rhel中定时任务cron解析

cron cron是一个工具名字,它的作用就是根据一定的时间策略,执行你指定的脚本,跟windows下的定时任务是一样的. 它对应的守护进程为crond,是被当做服务在开机的时候启动. 所以,cron可以使用服务管理命令,比如service,chkconfig来进行管理. 具体使用可参考: http://blog.csdn.net/jx_jy/article/details/13289217 配置文件 crond进程每一分钟被唤醒一次,读入自己的配置文件,根据配置文件中设定的策略执行脚本任务,c

Android安全防护之旅---带你把Apk混淆成中文语言代码

一.前言 最近想爆破一个app,没有加壳,简单的使用Jadx打开查看源码,结果把我逗乐了,代码中既然都是中文,而且是一些比较奇葩的中文字句,如图所示: 瞬间感觉懵逼了,这app真会玩,我们知道因为Java语言是支持双字符的,所以可以将包名,类名,变量名,方法名定义成中文,或者其他国家的语言都可以的.所以本身这种做法是不会运行报错的,比如下面我们新建一个Java工程看一下效果: 运行是没有任何问题的.看到这里的时候觉得很好奇,所以就先没去看他的源码了,而是想着怎么实现这种混淆的功能.下面就来介绍一

c# XML解析成EasyUI TreeGrid格式

1.分析EasyUI TreeGrid的数据格式,demo的格式是这样的:http://www.jeasyui.net/demo/treegrid_data1.json 分析之后,得到基本的JSON格式: [ { "id": 1, "name": "name1", "value": "", "children": [ { "id": 2, "name&quo

android黑科技系列——Apk混淆成中文语言代码

一.前言 最近想爆破一个app,没有加壳,简单的使用Jadx打开查看源码,结果把我逗乐了,代码中既然都是中文,而且是一些比较奇葩的中文字句,如图所示: 瞬间感觉懵逼了,这app真会玩,我们知道因为Java语言是支持双字符的,所以可以将包名,类名,变量名,方法名定义成中文,或者其他国家的语言都可以的.所以本身这种做法是不会运行报错的,比如下面我们新建一个Java工程看一下效果: 运行是没有任何问题的.看到这里的时候觉得很好奇,所以就先没去看他的源码了,而是想着怎么实现这种混淆的功能.下面就来介绍一

在C#中将金额转换成中文大写金额

具体代码如下: /// <summary> /// 金额转换成中文大写金额 /// </summary> /// <param name="LowerMoney">eg:10.74</param> /// <returns></returns> public static string MoneyToUpper(string LowerMoney) { string functionReturnValue = nu

Markdown(editormd)语法解析成html

我们在一些网站中可以见到一款网页编辑器--markdown: 这是一款功能强大的富文本编辑器,之前自己在网页上使用的时候遇到了一点点的问题,现在跟大家分享下 在我们写了文章之后是需要将内容保存到数据库的,如果保存到数据库中要方便以后需改的话,那么需要保存成markdown语言,如果保存成html语言通过反向解析成markdown这个可能效果不是很好 如果保存成markdown就涉及到将数据库中的数据取出后要解析成html,以下便是我的解决过程(我使用的是editormd): 首先需要初始化从ma

如何可以将PDF文件在线翻译成中文?

有时心血来潮,会在网上搜索一些专业的影评.杂志等资料,像这些资料格式PDF的多一些,而且有时还会看到纯英文版的,这样想利用起来,就必须要使用一些工具的帮助,就可以轻松的完成翻译的任务,让我们使用起来更轻松.不用下载,直接在网页上面就可以完成,非常的方便,一起来学习一下吧.     在线PDF翻译,可以直接把PDF.Word翻译成中文.英文.繁体中文等多国语言的文档.用户可自定义目标语言,翻译后的文档可以精确保留原文件的所有页面元素和排版.用户可以在短时间之内下载到转换之后的文件.只要用户可以连接

递归算法解析成树形结构

/** * 递归算法解析成树形结构 * * @param cid * @return * @author jiqinlin */ public TreeNodeModel recursiveTree(int org_code) { //根据cid获取节点对象(SELECT * FROM tb_tree t WHERE t.cid=?) MiddleOrgEntity middleOrgEntity = new MiddleOrgEntity(); middleOrgEntity.setTable

把man手册转换成中文

1  *  Copyright (c) 2012级, 烟台大学计算机学院 2  *  All rights reserved. 3  *  作者:付记超 4  *  完成日期:2015 年 6 月 6 日 5  *  版 本 号:v1.0 6  *  学习主题:把man手册转换成中文 7  *  使用环境:红帽5.8 8  *  使用好处: 9  *  使用时间: 10 *  如何使用: 11 *  学习内容:安装man-pages中文手册包 欢迎指正 QQ:2272172668  Email: