将定时任务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 页面我就不写了,自己去找吧)
将定时任务cron 解析成中文的更多相关文章
- quartz定时任务cron表达式讲解及翻译成现实语言的插件的使用详解
cron表达式讲解 参见该网址: https://www.cnblogs.com/GarfieldTom/p/3746290.html cron表达式只有专业技术人员才看得懂,普通人不知道表达式是什么 ...
- android黑科技系列——Apk混淆成中文语言代码
一.前言 最近想爆破一个app,没有加壳,简单的使用Jadx打开查看源码,结果把我逗乐了,代码中既然都是中文,而且是一些比较奇葩的中文字句,如图所示: 瞬间感觉懵逼了,这app真会玩,我们知道因为Ja ...
- linux设置定时任务(全面解析教程)
目录 一:系统定时任务 二:系统定时任务配置文件(crontab) 三:增加定时任务 1.crontab -e 2.1.sh 3.2.txt 四:查看crontab定时任务 五:定时任务配置文件(ro ...
- 最强cron解析器
背景 大家有没有这么一种困境 我现在需要去配置一个定时任务:"每天早上九点执行任务" 若你有一个好的定时任务平台,相信很容易就能配置完成.那若是没有定时任务平台呢?是不是就要自己写 ...
- Visual Studio 2015 如何将全英界面转成中文
1 启动VS2015程序,在菜单栏中找到tools 2 在弹出的下拉窗口中选中options 3 此时弹出的对话框,选中Environment下的international setting 4 点击获 ...
- WebApi系列~FromUri参数自动解析成实体的要求
回到目录 关于webapi我之前写了一些文章,大家可以根据目录去浏览,今天要说的是个怪问题,也是被我忽略的一个问题,当你的Url参数需要被Api自动解析成实体的属性,实事上是要有条件的,不是所以属性都 ...
- 介绍一个可以将Expression表达式树解析成Transact-SQL的项目Expression2Sql
一.Expression2Sql介绍 Expression2Sql是一个可以将Expression表达式树解析成Transact-SQL的项目.简单易用,几分钟即可上手使用,因为博主在设计Expres ...
- sql查询语句如何解析成分页查询?
我们公司主要mysql存储数据,因此也封装了比较好用mysql通用方法,然后,我们做大量接口,在处理分页查询接口,没有很好分查询方法.sql查询 语句如何解析成“分页查询”和“总统计”两条语句.可能, ...
- JS中将JSON的字符串解析成JSON数据格式《转》
在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 使用eval函数来解析,并且使用jquery的ea ...
随机推荐
- UESTC 424 AreYouBusy --混合背包
混合三种背包问题. 定义:dp[i][k]表示体积为k的时候,在前i堆里拿到的最大价值. 第一类,至少选一项,dp初值全赋为负无穷,这样才能保证不会出现都不选的情况.dp[i][k] = max(dp ...
- C++中不能声明为虚函数的有哪些函数
常见的不不能声明为虚函数的有:普通函数(非成员函数):静态成员函数:内联成员函数:构造函数:友元函数. 1.为什么C++不支持普通函数为虚函数? 普通函数(非成员函数)只能被overload,不能被o ...
- IO流的练习5 —— 读取文件中的字符串,排序后写入另一文件中
需求:已知s.txt文件中有这样的一个字符串:“hcexfgijkamdnoqrzstuvwybpl” 请编写程序读取数据内容,把数据排序后写入ss.txt中. 分析: A:读取文件中的数据 B:把数 ...
- Android Studio系列教程六--Gradle多渠道打包
Android Studio系列教程六--Gradle多渠道打包 2015 年 01 月 15 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzh ...
- javascript设置网页刷新或者重新加载后滚动条的位置不变
有个同事说再javascript中你可以做任何你想做的事情,当时觉得不以为然,今天遇到个问题,就是页面重新加载后总是回到页面的顶部,如果客户只想看到他想看到的部分是怎么变化的,这个体验就好了.原本想象 ...
- [Python] 利用commands模块执行Linux shell命令
http://blog.csdn.net/dbanote/article/details/9414133 http://zhou123.blog.51cto.com/4355617/1312791
- 利用ViewHolder优化自定义Adapter的典型写法
1 public class MarkerItemAdapter extends BaseAdapter { private Context mContext = null; private List ...
- 软件开发之路、Step 1 需求分析
百度百科 需求分析 所谓"需求分析",是指对要解决的问题进行详细的分析,弄清楚问题的要求,包括需要输入什么数据,要得到什么结果,最后应输出什么.可以说,在软件工程当中的“需求分析” ...
- 自己实现一个高大尚的Android客户端
毕业差不多一年了,一直做得都是很底层的东西,由于面向的客户群不同,主要实现在于功能,效率,没有很炫的界面,客户也并不在意界面有多炫.看到各大市场各种高大尚的app,简直亮瞎了我的眼啊,下决心自己实现一 ...
- LeetCode:Text Justification
题目链接 Given an array of words and a length L, format the text such that each line has exactly L chara ...