在使用定时器 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 页面我就不写了,自己去找吧)

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

  1. quartz定时任务cron表达式讲解及翻译成现实语言的插件的使用详解

    cron表达式讲解 参见该网址: https://www.cnblogs.com/GarfieldTom/p/3746290.html cron表达式只有专业技术人员才看得懂,普通人不知道表达式是什么 ...

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

    一.前言 最近想爆破一个app,没有加壳,简单的使用Jadx打开查看源码,结果把我逗乐了,代码中既然都是中文,而且是一些比较奇葩的中文字句,如图所示: 瞬间感觉懵逼了,这app真会玩,我们知道因为Ja ...

  3. linux设置定时任务(全面解析教程)

    目录 一:系统定时任务 二:系统定时任务配置文件(crontab) 三:增加定时任务 1.crontab -e 2.1.sh 3.2.txt 四:查看crontab定时任务 五:定时任务配置文件(ro ...

  4. 最强cron解析器

    背景 大家有没有这么一种困境 我现在需要去配置一个定时任务:"每天早上九点执行任务" 若你有一个好的定时任务平台,相信很容易就能配置完成.那若是没有定时任务平台呢?是不是就要自己写 ...

  5. Visual Studio 2015 如何将全英界面转成中文

    1 启动VS2015程序,在菜单栏中找到tools 2 在弹出的下拉窗口中选中options 3 此时弹出的对话框,选中Environment下的international setting 4 点击获 ...

  6. WebApi系列~FromUri参数自动解析成实体的要求

    回到目录 关于webapi我之前写了一些文章,大家可以根据目录去浏览,今天要说的是个怪问题,也是被我忽略的一个问题,当你的Url参数需要被Api自动解析成实体的属性,实事上是要有条件的,不是所以属性都 ...

  7. 介绍一个可以将Expression表达式树解析成Transact-SQL的项目Expression2Sql

    一.Expression2Sql介绍 Expression2Sql是一个可以将Expression表达式树解析成Transact-SQL的项目.简单易用,几分钟即可上手使用,因为博主在设计Expres ...

  8. sql查询语句如何解析成分页查询?

    我们公司主要mysql存储数据,因此也封装了比较好用mysql通用方法,然后,我们做大量接口,在处理分页查询接口,没有很好分查询方法.sql查询 语句如何解析成“分页查询”和“总统计”两条语句.可能, ...

  9. JS中将JSON的字符串解析成JSON数据格式《转》

    在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 使用eval函数来解析,并且使用jquery的ea ...

随机推荐

  1. 怎样绘制ZBrush中的纹理

    利用ZBrush的内置插件“投影大师”和“Polypainting”纹理贴图能够快速实现纹理的绘制.本文将对这两种方法的应用流程做一个介绍. 查看跟多内容请直接前往:http://www.zbrush ...

  2. POJ 1847 Tram --set实现最短路SPFA

    题意很好懂,但是不好下手.这里可以把每个点编个号(1-25),看做一个点,然后能够到达即为其两个点的编号之间有边,形成一幅图,然后求最短路的问题.并且pre数组记录前驱节点,print_path()方 ...

  3. AutoIT 实现Firefox下载

    Firefox下载的完整代码: Func IsVisible($handle) ;WinGetState: 2 = Window is visible If BitAND(WinGetState($h ...

  4. java11-5 String类的转换功能

    String的转换功能: byte[] getBytes():把字符串转换为字节数组. char[] toCharArray():把字符串转换为字符数组. static String valueOf( ...

  5. Wooyun隐写术总结

    之前还没有见到drops上有关于隐写术的总结,我之前对于隐写术比较有兴趣,感觉隐写术比较的好玩.所以就打算总结总结一些隐写术方面的东西.写的时候,可能会有错误的地方,请不吝赐教,谢谢. 本篇章中用到的 ...

  6. 利用concat进行数组复制

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. C# 调用C++/MFC写的dll

    C#调用C++的非托管类的dll其实很简单基本就是固定的调用格式. dll的编写,首先是打开VS新建一个C++的控制台程序,下一步后选择dll以及空文档即可.然后就是添加一个类添加一个方法.方法排头固 ...

  8. Linux第六次学习笔记

    存储器层次结构 存储器系统是一个具有不同容量.成本和访问时间的存储设备的层次结构. CPU寄存器保存着最常用的数据. 主存储器(简称主存)暂时存放存储在容量较大的.慢速磁盘上的数据. 高速缓存存储器作 ...

  9. MyBatis与Hibernate对比

    一.相同点 都屏蔽 jdbc api 的底层访问细节,使用我们不用与 jdbc api 打交道,就可以访问数据. jdbc api 编程流程固定,还将 sql 语句与 java 代码混杂在了一起,经常 ...

  10. 如何设置nesC在vim中语法高亮

    默认的vim没有支持nesC语法高亮,给阅读源码带来不便.不过可以通过装NesC Syntax Highlighting插件来解决这个问题,具体操作如下:   步骤一:下载插件 在http://www ...