字段 允许值 允许的特殊字符   
秒   0-59   , - * /   
分   0-59   , - * /   
小时 0-23   , - * /   
日期 1-31   , - * ? / L W C   
月份 1-12 或者 JAN-DEC , - * /   
星期 1-7 或者 SUN-SAT , - * ? / L C #   
年(可选) 留空, 1970-2099 , - * /
   
表达式意义     
"0 15 10 ? * *" 每天上午10:15触发   
"0 15 10 * * ?" 每天上午10:15触发   
"0 15 10 * * ? *" 每天上午10:15触发   
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发   
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发   
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发   
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发   
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发   
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发   
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发   
"0 15 10 15 * ?" 每月15日上午10:15触发   
"0 15 10 L * ?" 每月最后一日的上午10:15触发   
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发   
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发

'*' 字符可以用于所有字段,在“分”字段中设为"*"表示"每一分钟"的含义。

'?' 字符可以用在“日”和“周几”字段. 它用来指定 '不明确的值'. 这在你需要指定这两个字段中的某一个值而不是另外一个的时候会被用

到。在后面的例子中可以看到其含义。

'-' 字符被用来指定一个值的范围,比如在“小时”字段中设为"10-12"表示"10点到12点".

',' 字符指定数个值。比如在“周几”字段中设为"MON,WED,FRI"表示"the days Monday, Wednesday, and Friday".

'/' 字符用来指定一个值的的增加幅度. 比如在“秒”字段中设置为"0/15"表示"第0, 15, 30, 和 45秒"。而 "5/15"则表示"第5, 20, 35, 和

50". 在'/'前加"*"字符相当于指定从0秒开始. 每个字段都有一系列可以开始或结束的数值。对于“秒”和“分”字段来说,其数值范围为0到

59,对于“小时”字段来说其为0到23, 对于“日”字段来说为0到31, 而对于“月”字段来说为1到12。"/"字段仅仅只是帮助你在允许的数值

范围内从开始"第n"的值。 因此 对于“月”字段来说"7/6"只是表示7月被开启而不是“每六个月”, 请注意其中微妙的差别。

'L'字符可用在“日”和“周几”这两个字段。它是"last"的缩写, 但是在这两个字段中有不同的含义。例如,“日”字段中的"L"表示"一个月

中的最后一天" —— 对于一月就是31号对于二月来说就是28号(非闰年)。而在“周几”字段中, 它简单的表示"7" or "SAT",但是如果在“

周几”字段中使用时跟在某个数字之后, 它表示"该月最后一个星期×" —— 比如"6L"表示"该月最后一个周五"。当使用'L'选项时,指定确定

的列表或者范围非常重要,否则你会被结果搞糊涂的。

'W' 可用于“日”字段。用来指定历给定日期最近的工作日(周一到周五) 。比如你将“日”字段设为"15W",意为: "离该月15号最近的工作日

"。因此如果15号为周六,触发器会在14号即周五调用。如果15号为周日, 触发器会在16号也就是周一触发。如果15号为周二,那么当天就会触

发。然而如果你将“日”字段设为"1W", 而一号又是周六, 触发器会于下周一也就是当月的3号触发,因为它不会越过当月的值的范围边界。'W'

字符只能用于“日”字段的值为单独的一天而不是一系列值的时候。

'L'和'W'可以组合用于“日”字段表示为'LW',意为"该月最后一个工作日"。

'#' 字符可用于“周几”字段。该字符表示“该月第几个周×”,比如"6#3"表示该月第三个周五( 6表示周五而"#3"该月第三个)。再比如:

"2#1" = 表示该月第一个周一而 "4#5" = 该月第五个周三。注意如果你指定"#5"该月没有第五个“周×”,该月是不会触发的。

'C' 字符可用于“日”和“周几”字段,它是"calendar"的缩写。 它表示为基于相关的日历所计算出的值(如果有的话)。如果没有关联的日

历, 那它等同于包含全部日历。“日”字段值为"5C"表示"日历中的第一天或者5号以后",“周几”字段值为"1C"则表示"日历中的第一天或者

周日以后"。

对于“月份”字段和“周几”字段来说合法的字符都不是大小写敏感的。

验证CronExpression表达式合法性的j函数 并非正则表达式

view plain
  1. function cronValidate(cronExpression ){
  2. //alert("校验函数的开始!");
  3. var cronParams = cronExpression.split(" ");
  4. if (cronParams.length < 6 || cronParams.length > 7) {
  5. return false;
  6. }
  7. //CronTrigger cronTrigger = new CronTrigger();
  8. //cronTrigger.setCronExpression( cronExpression );
  9. if (cronParams[3] == "?" || cronParams[5]=="?") {
  10. //Check seconds param
  11. if (!checkSecondsField(cronParams[0])) {
  12. return false;
  13. }
  14. //Check minutes param
  15. if (!checkMinutesField(cronParams[1])) {
  16. return false;
  17. }
  18. //Check hours param
  19. if (!checkHoursField(cronParams[2])) {
  20. return false;
  21. }
  22. //Check day-of-month param
  23. if (!checkDayOfMonthField(cronParams[3])) {
  24. return false;
  25. }
  26. //Check months param
  27. if (!checkMonthsField(cronParams[4])) {
  28. return false;
  29. }
  30. //Check day-of-week param
  31. if (!checkDayOfWeekField(cronParams[5])) {
  32. return false;
  33. }
  34. //Check year param
  35. if (cronParams.length == 7) {
  36. if (!checkYearField(cronParams[6])) {
  37. return false;
  38. }
  39. }
  40. return true;
  41. } else {
  42. return false;
  43. }
  44. }
  45. function checkSecondsField(secondsField) {
  46. return checkField(secondsField, 0, 59);
  47. }
  48. function checkField(secondsField, minimal, maximal) {
  49. if (secondsField.indexOf("-") > -1 ) {
  50. var startValue = secondsField.substring(0, secondsField.indexOf( "-" ));
  51. var endValue = secondsField.substring(secondsField.indexOf( "-" ) + 1);
  52. if (!(checkIntValue(startValue, minimal, maximal, true) && checkIntValue(endValue, minimal, maximal, true))) {
  53. return false;
  54. }
  55. try {
  56. var startVal = parseInt(startValue, 10);
  57. var endVal = parseInt(endValue, 10);
  58. return endVal > startVal;
  59. } catch (e) {
  60. return false;
  61. }
  62. } else if (secondsField.indexOf(",") > -1) {
  63. return checkListField(secondsField, minimal, maximal);
  64. } else if (secondsField.indexOf( "/" ) > -1) {
  65. return checkIncrementField( secondsField, minimal, maximal );
  66. } else if (secondsField.indexOf( "*" ) != -1) {
  67. return true;
  68. } else {
  69. return checkIntValue(secondsField, minimal, maximal);
  70. }
  71. }
  72. function checkIntValue(value, minimal, maximal, checkExtremity) {
  73. try {
  74. var val = parseInt(value, 10);
  75. //判断是否为整数
  76. if (value == val) {
  77. if (checkExtremity) {
  78. if (val < minimal || val > maximal) {
  79. return false;
  80. }
  81. }
  82. return true;
  83. }
  84. return false;
  85. } catch (e) {
  86. return false;
  87. }
  88. }
  89. function checkMinutesField(minutesField) {
  90. return checkField(minutesField, 0, 59);
  91. }
  92. function checkHoursField(hoursField) {
  93. return checkField(hoursField, 0, 23);
  94. }
  95. function checkDayOfMonthField(dayOfMonthField) {
  96. if (dayOfMonthField == "?") {
  97. return true;
  98. }
  99. if (dayOfMonthField.indexOf("L") >= 0) {
  100. return checkFieldWithLetter(dayOfMonthField, "L", 1, 7, -1, -1);
  101. } else if ( dayOfMonthField.indexOf("W") >= 0) {
  102. return checkFieldWithLetter(dayOfMonthField, "W", 1, 31, -1, -1);
  103. } else if (dayOfMonthField.indexOf("C") >= 0) {
  104. return checkFieldWithLetter(dayOfMonthField, "C", 1, 31, -1, -1);
  105. } else {
  106. return checkField( dayOfMonthField, 1, 31 );
  107. }
  108. }
  109. function checkMonthsField(monthsField) {
  110. /*        monthsField = StringUtils.replace( monthsField, "JAN", "1" );
  111. monthsField = StringUtils.replace( monthsField, "FEB", "2" );
  112. monthsField = StringUtils.replace( monthsField, "MAR", "3" );
  113. monthsField = StringUtils.replace( monthsField, "APR", "4" );
  114. monthsField = StringUtils.replace( monthsField, "MAY", "5" );
  115. monthsField = StringUtils.replace( monthsField, "JUN", "6" );
  116. monthsField = StringUtils.replace( monthsField, "JUL", "7" );
  117. monthsField = StringUtils.replace( monthsField, "AUG", "8" );
  118. monthsField = StringUtils.replace( monthsField, "SEP", "9" );
  119. monthsField = StringUtils.replace( monthsField, "OCT", "10" );
  120. monthsField = StringUtils.replace( monthsField, "NOV", "11" );
  121. monthsField = StringUtils.replace( monthsField, "DEC", "12" );*/
  122. monthsField.replace("JAN", "1");
  123. monthsField.replace("FEB", "2");
  124. monthsField.replace("MAR", "3");
  125. monthsField.replace("APR", "4");
  126. monthsField.replace("MAY", "5");
  127. monthsField.replace("JUN", "6");
  128. monthsField.replace("JUL", "7");
  129. monthsField.replace("AUG", "8");
  130. monthsField.replace("SEP", "9");
  131. monthsField.replace("OCT", "10");
  132. monthsField.replace("NOV", "11");
  133. monthsField.replace("DEC", "12");
  134. return checkField(monthsField, 1, 31);
  135. }
  136. function checkDayOfWeekField(dayOfWeekField) {
  137. /*        dayOfWeekField = StringUtils.replace( dayOfWeekField, "SUN", "1" );
  138. dayOfWeekField = StringUtils.replace( dayOfWeekField, "MON", "2" );
  139. dayOfWeekField = StringUtils.replace( dayOfWeekField, "TUE", "3" );
  140. dayOfWeekField = StringUtils.replace( dayOfWeekField, "WED", "4" );
  141. dayOfWeekField = StringUtils.replace( dayOfWeekField, "THU", "5" );
  142. dayOfWeekField = StringUtils.replace( dayOfWeekField, "FRI", "6" );
  143. dayOfWeekField = StringUtils.replace( dayOfWeekField, "SAT", "7" );*/
  144. dayOfWeekField.replace("SUN", "1" );
  145. dayOfWeekField.replace("MON", "2" );
  146. dayOfWeekField.replace("TUE", "3" );
  147. dayOfWeekField.replace("WED", "4" );
  148. dayOfWeekField.replace("THU", "5" );
  149. dayOfWeekField.replace("FRI", "6" );
  150. dayOfWeekField.replace("SAT", "7" );
  151. if (dayOfWeekField == "?") {
  152. return true;
  153. }
  154. if (dayOfWeekField.indexOf("L") >= 0) {
  155. return checkFieldWithLetter(dayOfWeekField, "L", 1, 7, -1, -1);
  156. } else if (dayOfWeekField.indexOf("C") >= 0) {
  157. return checkFieldWithLetter(dayOfWeekField, "C", 1, 7, -1, -1);
  158. } else if (dayOfWeekField.indexOf("#") >= 0) {
  159. return checkFieldWithLetter(dayOfWeekField, "#", 1, 7, 1, 5);
  160. } else {
  161. return checkField(dayOfWeekField, 1, 7);
  162. }
  163. }
  164. function checkYearField(yearField) {
  165. return checkField(yearField, 1970, 2099);
  166. }
  167. function checkFieldWithLetter(value, letter, minimalBefore, maximalBefore,
  168. minimalAfter, maximalAfter) {
  169. var canBeAlone = false;
  170. var canHaveIntBefore = false;
  171. var canHaveIntAfter = false;
  172. var mustHaveIntBefore = false;
  173. var mustHaveIntAfter = false;
  174. if (letter == "L") {
  175. canBeAlone = true;
  176. canHaveIntBefore = true;
  177. canHaveIntAfter = false;
  178. mustHaveIntBefore = false;
  179. mustHaveIntAfter = false;
  180. }
  181. if (letter == "W" || letter == "C") {
  182. canBeAlone = false;
  183. canHaveIntBefore = true;
  184. canHaveIntAfter = false;
  185. mustHaveIntBefore = true;
  186. mustHaveIntAfter = false;
  187. }
  188. if (letter == "#") {
  189. canBeAlone = false;
  190. canHaveIntBefore = true;
  191. canHaveIntAfter = true;
  192. mustHaveIntBefore = true;
  193. mustHaveIntAfter = true;
  194. }
  195. var beforeLetter = "";
  196. var afterLetter = "";
  197. if (value.indexOf(letter) >= 0 ) {
  198. beforeLetter = value.substring( 0, value.indexOf(letter));
  199. }
  200. if (!value.endsWith(letter)) {
  201. afterLetter = value.substring( value.indexOf( letter ) + 1 );
  202. }
  203. if (value.indexOf(letter) >= 0) {
  204. if (letter == value) {
  205. return canBeAlone;
  206. }
  207. if (canHaveIntBefore) {
  208. if (mustHaveIntBefore && beforeLetter.length == 0) {
  209. return false;
  210. }
  211. if (!checkIntValue(beforeLetter, minimalBefore, maximalBefore, true)){
  212. return false;
  213. }
  214. } else {
  215. if (beforeLetter.length > 0 ) {
  216. return false;
  217. }
  218. }
  219. if (canHaveIntAfter) {
  220. if ( mustHaveIntAfter && afterLetter.length == 0 ) {
  221. return false;
  222. }
  223. if (!checkIntValue(afterLetter, minimalAfter, maximalAfter, true)) {
  224. return false;
  225. }
  226. } else {
  227. if (afterLetter.length > 0) {
  228. return false;
  229. }
  230. }
  231. }
  232. return true;
  233. }
  234. /*    function checkIntValue(value, minimal, maximal) {
  235. return checkIntValue(value, minimal, maximal, true);
  236. } */
  237. function checkIncrementField(value, minimal, maximal) {
  238. var start = value.substring(0, value.indexOf("/"));
  239. var increment = value.substring(value.indexOf("/") + 1);
  240. if (!("*" == start)) {
  241. return checkIntValue(start, minimal, maximal, true) && checkIntValue(increment, minimal, maximal, false);
  242. } else {
  243. return checkIntValue(increment, minimal, maximal, true);
  244. }
  245. }
  246. function checkListField(value, minimal, maximal ) {
  247. var st = value.split(",");
  248. var values = new Array(st.length);
  249. for(var j = 0; j < st.length; j++) {
  250. values[j] = st[j];
  251. }
  252. var previousValue = -1;
  253. for (var i= 0; i < values.length; i++) {
  254. var currentValue = values[i];
  255. if (!checkIntValue(currentValue, minimal, maximal, true)) {
  256. return false;
  257. }
  258. try {
  259. var val = parseInt(currentValue, 10);
  260. if (val <= previousValue) {
  261. return false;
  262. } else {
  263. previousValue = val;
  264. }
  265. } catch (e) {
  266. // we have always an int
  267. }
  268. }
  269. return true;
  270. }

参考:http://blog.csdn.net/q421022/article/details/4504068

CronExpression_CronExpression 规则相关推荐

  1. 浅显易懂 Makefile 入门 (03)— 目标文件搜索(VPATH 和 vpath 的区别和使用)、隐含规则

    1. 目标文件搜索(VPATH和vpath) 如果需要的文件是存在于不同的路径下(即源文件与 Makefile 文件不在同一个路径下),在编译的时候就用到了 Makefile 中为我们提供的目录搜索文 ...

  2. 浅显易懂 Makefile 入门 (01)— 什么是Makefile、为什么要用Makefile、Makefile规则、Makefile流程如何实现增量编译

    1. 什么是 Makefile Makefile 文件描述了 Linux 系统下 C/C++ 工程的编译规则,它用来自动化编译 C/C++ 项目.一旦写编写好 Makefile 文件,只需要一个 ma ...

  3. Java中类、常量、变量、方法名等命名规则

    Java中类.常量.变量.方法名等命名规则 命名规则: 命名由字母.数字.下划线.美元符号($)构成. 命名不可以数字作为开头. 长度无限制,但不可存在空格. 大小写所表述内容含义不同. 命名不可与J ...

  4. LeetCode简单题之统计匹配检索规则的物品数量

    题目 给你一个数组 items ,其中 items[i] = [typei, colori, namei] ,描述第 i 件物品的类型.颜色以及名称. 另给你一条由两个字符串 ruleKey 和 ru ...

  5. LLVM一些语法规则

    LLVM一些语法规则 LLVM文档 LLVM编译器基础架构支持广泛的项目,从工业强度编译器到专门的JIT应用程序,再到小型研究项目. 同样,文档分为几个针对不同受众的高级别分组: LLVM设计概述 几 ...

  6. Go 学习笔记(53)— Go 标准库之 path(判断绝对路径、拆分目录和文件、组合路径、返回路径目录、获取路径最后文件名、获取文件扩展名、路径匹配规则)

    1. 概述说明 import "path" path 实现了对斜杠分隔的路径的实用操作函数. 2. 主要函数 2.1 func IsAbs func IsAbs(path stri ...

  7. Go 学习笔记(26)— Go 习惯用法(多值赋值,短变量声明和赋值,简写模式、多值返回函数、comma,ok 表达式、传值规则)

    1. 多值赋值 可以一次性声明多个变量,并可以在声明时赋值,而且可以省略类型,但必须遵守一定的规则要求. package main import "fmt"func main() ...

  8. [笔记]C#基础入门(八)——C#标识符的命名规则

    程序中的变量名.常量名.类名.方法名,都叫做标识符.C#有一套标识符的命名规则,如果命名时不遵守规则,就会出错.这套规则简单说有下面三条: ①标识符只能由英文字母.数字和下划线组成,不能包含空格和其他 ...

  9. 关于对IPtables规则的理解

    1,iptables中的所有规则都会存放到/etc/sysconfig/iptables文件中 2,最前端的规则既是现有规则 3,如果要改变现有的规则有两种办法: (1) 使用iptables -t ...

最新文章

  1. 监听发现局域网dropbox客户端broadcast-dropbox-listener
  2. 数据表格搜索php代码_手把手教学:提取PDF各种表格文本数据(附代码)
  3. intellij idea 如何一键清除所有断点
  4. 关于使浏览器崩溃的代码尝试
  5. 配置apache支持cgi
  6. WIN10+MinGW中文输出乱码的解决方法
  7. caffe学习:通过研读classification.cpp了解如何使用caffe模型
  8. 到底该不该使用存储过程
  9. DBeaverEE 21.1.0安装指南
  10. 机器学习笔记——深度学习入门篇
  11. 分块编码(Transfer-Encoding: chunked)
  12. 二进制数据(Image类型)从一个表存入另一个表
  13. 快递员凌晨送件,将下班程序员误认成小偷
  14. RAC安装时,报The specified nodes are not clusterable 的解决方法
  15. 机器学习算法初识—二分k均值算法
  16. JAVAFX输入法的实现
  17. 2016,我有些明白了
  18. java微信公众号扫码登录对接流程
  19. H.264流媒体协议格式中的Annex B格式和AVCC格式深度解析
  20. 纺织ERP_印染ERP软件_指点ERP简介

热门文章

  1. 事业单位固定资产管理系统软件解决方案
  2. Sentinel 滑动窗口实现原理 侵删
  3. TeXstudio安装和运行
  4. FRP内网穿透--实现公网ip远程访问内网8080端口
  5. 电子货架标签——添加苹果版本APP操控
  6. 腾讯知名软件全线下架,网友一片唏嘘
  7. WorkNC使法国汽车模具制造商Julien SA的精加工时间从32个小时减少至14个小时。
  8. 华为云人脸识别SDK踩坑日记
  9. ChatGPT实战:如何进行高难度沟通
  10. 全国大学生数学建模大赛 B 题解题思路