1. 程式人生 > >Spring Quartz cronExpression中問號(?)的解釋

Spring Quartz cronExpression中問號(?)的解釋

轉自:http://blog.csdn.net/chh_jiang/article/details/4603529

關於cronExpression網上可以搜到一大堆官方文件及其翻譯,大部分都是出自同一篇轉文,翻譯的部分充滿了錯誤和語病,尤其是關於問號(?)的解釋部分,實在是沒法看。還是自己研究一下吧。

官方文件上提到問號時是這樣說的:

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.

大致意思是說:

問號(?)可以用在日期或星期欄位,用來指明‘沒有特定的值’,當你為這兩個欄位中的一個設定值的時候就會用到它。下面的例子中說明了這一點。

可是,在後面的例子中並沒有明確說明這個問號到底起什麼作用,於是我程式設計試驗了一下,得出以下結論:

1、如官方文件解釋的那樣,問號(?)的作用是指明該欄位‘沒有特定的值’;

2、星號(*)和其它值,比如數字,都是給該欄位指明特定的值,只不過用星號(*)代表所有可能值;

3、cronExpression對日期和星期欄位的處理規則是它們必須互斥,即只能且必須有一個欄位有特定的值,另一個欄位必須是‘沒有特定的值’;

4、問號(?)就是用來對日期和星期欄位做互斥的。

基於以上結論就可以解釋下列情況:

1、當星期和日期都為*或數字時,報錯
Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.

即兩個欄位不能都指明的特定的值,必須互斥。這裡的*和數字是一樣的,如果都指明特定的數字,也是報一樣的錯。

2、當星期和日期都為?時,報錯
'?' can only be specfied for Day-of-Month -OR- Day-of-Week.

即兩個欄位不能都‘沒有特定的值’。

這個是Spring的實現,沒有什麼道理,Spring就是規定這兩個欄位必須這樣互斥的設定。

這與UNIX的crontab設定不一樣,crontab的規則是日期和星期中只要滿足一個就觸發,所以不存在互斥的問題。