关于cronExpression网上能够搜到一大堆官方文档及其翻译,大部分都是出自同一篇转文,翻译的部分充满了错误和语病,尤为是关于问号(?)的解释部分,实在是无法看。仍是本身研究一下吧。编程
官方文档上提到问号时是这样说的:spa
The '?' character is allowed for the day-of-month and day-of-week fields. It is used to specify 'no specific value'. This is useful when you need to specify something in one of the two fileds, but not the other. See the examples below for clarification.翻译
大体意思是说:orm
问号(?)能够用在日期或星期字段,用来指明‘没有特定的值’,当你为这两个字段中的一个设定值的时候就会用到它。下面的例子中说明了这一点。crontab
但是,在后面的例子中并无明确说明这个问号到底起什么做用,因而我编程试验了一下,得出如下结论:ci
一、如官方文档解释的那样,问号(?)的做用是指明该字段‘没有特定的值’;文档
二、星号(*)和其它值,好比数字,都是给该字段指明特定的值,只不过用星号(*)表明全部可能值;it
三、cronExpression对日期和星期字段的处理规则是它们必须互斥,即只能且必须有一个字段有特定的值,另外一个字段必须是‘没有特定的值’;io
四、问号(?)就是用来对日期和星期字段作互斥的。sed
基于以上结论就能够解释下列状况:
一、当星期和日期都为*或数字时,报错
Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.
即两个字段不能都指明的特定的值,必须互斥。这里的*和数字是同样的,若是都指明特定的数字,也是报同样的错。
二、当星期和日期都为?时,报错
'?' can only be specfied for Day-of-Month -OR- Day-of-Week.
即两个字段不能都‘没有特定的值’。
这个是Spring的实现,没有什么道理,Spring就是规定这两个字段必须这样互斥的设置。
这与UNIX的crontab设置不同,crontab的规则是日期和星期中只要知足一个就触发,因此不存在互斥的问题。