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

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

  1. package com.common.utils;
  2.  
  3. import java.text.ParseException;
  4. import java.text.SimpleDateFormat;
  5. import java.util.ArrayList;
  6. import java.util.Calendar;
  7. import java.util.Date;
  8. import java.util.List;
  9.  
  10. import org.quartz.CronExpression;
  11.  
  12. public class CronExpParser
  13. {
  14. /**
  15. * 解析corn表达式,生成指定日期的时间序列
  16. *
  17. * @param cronExpression cron表达式
  18. * @param cronDate cron解析日期
  19. * @param result crom解析时间序列
  20. * @return 解析成功失败
  21. */
  22. public static boolean parser(String cronExpression, String cronDate, List<String> result)
  23. {
  24. if (cronExpression == null || cronExpression.length() < 1 || cronDate == null || cronDate.length() < 1)
  25. {
  26. return false;
  27. }
  28. else
  29. {
  30. CronExpression exp = null;
  31. // 初始化cron表达式解析器
  32. try
  33. {
  34. exp = new CronExpression(cronExpression);
  35. }
  36. catch (ParseException e)
  37. {
  38. // TODO Auto-generated catch block
  39. e.printStackTrace();
  40. return false;
  41. }
  42.  
  43. // 定义生成时间范围
  44. // 定义开始时间,前一天的23点59分59秒
  45. Calendar c = Calendar.getInstance();
  46. String sStart = cronDate + " 00:00:00";
  47. SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  48. Date dStart = null;
  49. try
  50. {
  51. dStart = sdf.parse(sStart);
  52. }
  53. catch (ParseException e)
  54. {
  55. // TODO Auto-generated catch block
  56. e.printStackTrace();
  57. }
  58.  
  59. c.setTime(dStart);
  60. c.add(Calendar.SECOND, -1);
  61. dStart = c.getTime();
  62.  
  63. // 定义结束时间,当天的23点59分59秒
  64. c.add(Calendar.DATE, 1);
  65. Date dEnd = c.getTime();
  66.  
  67. // 生成时间序列
  68. java.util.Date dd = dStart;
  69. dd = exp.getNextValidTimeAfter(dd);
  70. while ((dd.getTime() >= dStart.getTime()) && (dd.getTime() <= dEnd.getTime()))
  71. {
  72. result.add(sdf.format(dd));
  73. dd = exp.getNextValidTimeAfter(dd);
  74. }
  75. exp = null;
  76. }
  77. return true;
  78. }
  79.  
  80. public static String translateToChinese(String cronExp)
  81. {
  82. if (cronExp == null || cronExp.length() < 1)
  83. {
  84. return "cron表达式为空";
  85. }
  86. CronExpression exp = null;
  87. // 初始化cron表达式解析器
  88. try
  89. {
  90. exp = new CronExpression(cronExp);
  91. }
  92. catch (ParseException e)
  93. {
  94. return "corn表达式不正确";
  95. }
  96. String[] tmpCorns = cronExp.split(" ");
  97. StringBuffer sBuffer = new StringBuffer();
  98. if(tmpCorns.length == 6)
  99. {
  100. //解析月
  101. if(!tmpCorns[4].equals("*"))
  102. {
  103. sBuffer.append(tmpCorns[4]).append("月");
  104. }
  105. else
  106. {
  107. sBuffer.append("每月");
  108. }
  109. //解析周
  110. if(!tmpCorns[5].equals("*") && !tmpCorns[5].equals("?"))
  111. {
  112. char[] tmpArray = tmpCorns[5].toCharArray();
  113. for(char tmp:tmpArray)
  114. {
  115. switch (tmp)
  116. {
  117. case '1':
  118. sBuffer.append("星期天");
  119. break;
  120. case '2':
  121. sBuffer.append("星期一");
  122. break;
  123. case '3':
  124. sBuffer.append("星期二");
  125. break;
  126. case '4':
  127. sBuffer.append("星期三");
  128. break;
  129. case '5':
  130. sBuffer.append("星期四");
  131. break;
  132. case '6':
  133. sBuffer.append("星期五");
  134. break;
  135. case '7':
  136. sBuffer.append("星期六");
  137. break;
  138. case '-':
  139. sBuffer.append("至");
  140. break;
  141. default:
  142. sBuffer.append(tmp);
  143. break;
  144. }
  145. }
  146. }
  147.  
  148. //解析日
  149. if(!tmpCorns[3].equals("?"))
  150. {
  151. if(!tmpCorns[3].equals("*"))
  152. {
  153. sBuffer.append(tmpCorns[3]).append("日");
  154. }
  155. else
  156. {
  157. sBuffer.append("每日");
  158. }
  159. }
  160.  
  161. //解析时
  162. if(!tmpCorns[2].equals("*"))
  163. {
  164. sBuffer.append(tmpCorns[2]).append("时");
  165. }
  166. else
  167. {
  168. sBuffer.append("每时");
  169. }
  170.  
  171. //解析分
  172. if(!tmpCorns[1].equals("*"))
  173. {
  174. sBuffer.append(tmpCorns[1]).append("分");
  175. }
  176. else
  177. {
  178. sBuffer.append("每分");
  179. }
  180.  
  181. //解析秒
  182. if(!tmpCorns[0].equals("*"))
  183. {
  184. sBuffer.append(tmpCorns[0]).append("秒");
  185. }
  186. else
  187. {
  188. sBuffer.append("每秒");
  189. }
  190. }
  191.  
  192. return sBuffer.toString();
  193.  
  194. }
  195.  
  196. //测试方法
  197. public static void main(String[] args)
  198. {
  199. String CRON_EXPRESSION = "0 0 3 * * ?";
  200. // 生成指定日期的CRON时间序列
  201. String CRON_DATE = "2016-04-26";
  202. System.out.println(CRON_EXPRESSION);
  203. System.out.println(CronExpParser.translateToChinese(CRON_EXPRESSION));
  204.  
  205. List<String> lTime = new ArrayList<String>();
  206. if(!CronExpParser.parser(CRON_EXPRESSION, CRON_DATE, lTime)){
  207. System.out.println("无法生成Cron表达式:日期,"+CRON_DATE+";不符合规则cron表达式:"+CRON_EXPRESSION);
  208. }
  209. for(int i=0;i<lTime.size();i++){
  210. System.out.println(lTime.get(i));
  211. }
  212.  
  213. }
  214. }

执行结果:

  1. 0 0 3 * * ?
  2. 每月每日300
  3. 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 就可以实现描述的 更新啦

  1. function checkCron()
  2. {
  3. var datas={
  4. "cronExp":$("#cron").val()
  5. };
  6. $.ajax({
  7. type: "post",
  8. url: "/getCronDesc",
  9. data: datas,
  10. datatype: "text",
  11. success:function(data){ //成功的处理函数
  12. $("#cronDesc").html(data);
  13. }
  14. });
  15. }

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

打开一个新的页面

  1. openWin("../../static/cron/cronindex.htm", 640, 480);
  2.  
  3. function openWin(url,width,height)
  4. {
  5. 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);
  6. }

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

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

(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. hdu-5496 Beauty of Sequence(递推)

    题目链接: Beauty of Sequence Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java ...

  2. hdu-5895 Mathematician QSC(数学)

    题目链接: Mathematician QSC Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Jav ...

  3. Jenkins学习六:修改Jenkins用户的密码

    很多时候在使用jenkins的时候忘记密码了,遇到这种情况,可以看看下面的讲解. Jenkins专有用户的数据存放在JENKINS_HOME/users目录.users目录的结构你一看就懂.users ...

  4. SQL Server 2005 安装图解教程(Windows)

    因工作需要,好久未安装SQL Server2005,今天安装了一下,特此写下安装步骤留下笔记. 安装前准备: 先安装IIS,再安装SQL Server2005 一.安装 点击安装,如下图: 选择操作系 ...

  5. SpringMVC系列之基本配置

    一.概述 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请 ...

  6. [转] Centos 6.4 python 2.6 升级到 2.7

    http://blog.csdn.net/jcjc918/article/details/11022345

  7. 头像上传功能实现,PC端的需要做兼容

    暂时实现的效果: http://sandbox.runjs.cn/show/v2vkds3j <form action=""> <img id="vie ...

  8. 005医疗项目-模块一:用户的查找:1.用户表查询的sql语句

    这是医疗项目的第一个模块:做一个用户的查询,可以根据用户的账号,用户的名称,单位的名称,用户的类型去查询.要求效果如下:

  9. 【转】【Http】Http各种错误的意思

    IIS状态代码的含义 当用户试图通过HTTP或文件传输协议(FTP)访问一台正在运行Internet信息服务(IIS)的服务器上的内容时,IIS返回一个表示该请求的状态的数字代码.该状态代码记录在II ...

  10. 项目移植将eclipse里面的项目移植到intellij idea里面

    怎么关联多个库 .  A B C D,A依赖BC,D依赖A,怎么搞? 注意: as和idea里面,project是工作空间的意思,这里面model才是项目. 打开主项目D 打开已经存在的model 导 ...