解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
|
# Cron ʹÓÃÊÖ²á
`NewLife.Threading.Cron` ÊÇÒ»¸öÇáÁ¿¼¶ Cron ±í´ïʽ½âÎöÓëÆ¥ÅäÆ÷£¬ÓÃÓÚÔÚ¡°Ãë¼¶¡±ÅжÏij¸öʱ¼äÊÇ·ñÃüÖйæÔò£¬²¢¼ÆËãÏÂÒ»´Î/ÉÏÒ»´ÎÃüÖÐʱ¼ä¡£
- Ô´Â룺`NewLife.Core\Threading\Cron.cs`
- ÃüÃû¿Õ¼ä£º`NewLife.Threading`
---
## 1. ÊÊÓó¡¾°
- ÐèÒªÓÃ×Ö·û´®ÃèÊö¡°¹Ì¶¨Ê±¼äµã/ÖÜÆÚÐÔʱ¼äµã¡±´¥·¢¹æÔò
- ÐèÒª¸ù¾Ýµ±Ç°Ê±¼ä¿ìËÙÅжÏÊÇ·ñÃüÖÐ
- ÐèÒª¼ÆËãÏÂÒ»´Î´¥·¢µãÓÃÓÚµ÷¶È£¨µäÐÍ´îÅä `TimerX`£©
> Éè¼ÆÈ¡É᣺ʵÏÖ¼òµ¥¡¢ÎÞÍⲿÒÀÀµ£»`GetNext/GetPrevious` ʹÓÃÖðÃë±éÀú£¨×î¶à 1 Ä꣩£¬Êʺϵ÷¶È²ãʹÓ㬲»½¨ÒéÔÚÈȵã·¾¶¸ßƵµ÷Óá£
---
## 2. ±í´ïʽ¸ñʽ
### 2.1 ×Ö¶Î
±í´ïʽÓɿոñ·Ö¸ô£¬×î¶àÖ§³Ö 6 ¶Î£¨²»×ãµÄ¶ÎĬÈÏ `*`£©£º
```
Ãë ·Ö Ê± ÈÕ Ô ÖÜ
```
×ֶη¶Î§£¨ÓÉ `Parse` ÄÚ²¿²ÎÊý¾ö¶¨£©£º
| ×Ö¶Î | ·¶Î§ | ˵Ã÷ |
|---|---:|---|
| Ãë | 0-59 | `TryParse(..., 0, 60)` |
| ·Ö | 0-59 | `TryParse(..., 0, 60)` |
| ʱ | 0-23 | `TryParse(..., 0, 24)` |
| ÈÕ(ÿÔÂ) | 1-31 | `TryParse(..., 1, 32)` |
| ÔÂ | 1-12 | `TryParse(..., 1, 13)` |
| ÖÜ | 0-6£¨²¢ÔÊÐí 7 µÄд·¨£© | `TryParseWeek(..., 0, 7)` |
> ×¢£ºÀà×¢ÊÍÌáµ½¡°Äꡱ×ֶΣ¬µ«µ±Ç°ÊµÏÖδ½âÎöµÚ 7 ¶Î¡£
### 2.2 Ö§³ÖµÄÓï·¨
ÿ¶Î×Ö¶ÎÖ§³Ö£º
- `*`£ºÈÎÒâÖµ
- `?`£º²»Ö¸¶¨Öµ£¨ÊµÏÖÉϵȼÛÓÚ `*` ´¦Àí£¬²¢²»»áÏñ Quartz ÄÇÑù¡°ºöÂÔ¸Ã×ֶΡ±£©
- `a,b,c`£ºÃ¶¾Ù
- `a-b`£º·¶Î§£¨°üº¬¶Ëµã£©
- `*/n`¡¢`a/n`¡¢`a-b/n`£º²½½ø
ÖÜ×ֶζîÍâÖ§³Ö£º
- `d#k`£ºÃ¿ÔÂµÚ `k` ¸öÐÇÆÚ `d`
- `d#Lk`£ºÃ¿Ôµ¹ÊýµÚ `k` ¸öÐÇÆÚ `d`
> `#` Óï·¨ÔÚʵÏÖÖлὫ²½½øÉèΪ `7`£¬ÓÃÓÚÆ¥Å䡰ͬһÖܼ¸¡±µÄÐòºÅ¼ÆËã¡£
---
## 3. ÐÇÆÚ£¨ÖÜ£©¹æÔòÓë `Sunday` Æ«ÒÆ
### 3.1 ĬÈϹæÔò
`Cron` ĬÈϲÉÓà Linux/.NET ³£¼û¹æÔò£º
- `0` ±íʾÖÜÈÕ
- `1` ±íʾÖÜÒ»
- ...
- `6` ±íʾÖÜÁù
ÔÚ `IsTime(DateTime time)` ÖУº
```csharp
var w = (Int32)time.DayOfWeek + Sunday;
```
Òò´Ë£¬Êµ¼ÊÆ¥Åä¼ü»áÊÜ `Sunday` Ó°Ïì¡£
### 3.2 `Sunday` Æ«ÒÆ
`Sunday` ÓÃÓÚ¡°ÖÜÈÕ¶ÔÓ¦µÄÊý×Ö¡±Æ«ÒÆ£º
- `Sunday = 0`£¨Ä¬ÈÏ£©£º`DayOfWeek.Sunday(0)` ¡ú 0
- `Sunday = 1`£º`DayOfWeek.Sunday(0)` ¡ú 1£¬`Monday(1)` ¡ú 2 ...
ʹÓý¨Ò飺
- Èç¹ûÄãÏ£Íû±í´ïʽÀïÓà `1` ±íʾÖÜÈÕ£¬ÔòÉèÖà `cron.Sunday = 1`
- `Parse` ²»»á×Ô¶¯ÍÆ¶Ï `Sunday` ·ç¸ñ£¬ÐèÒªÓɵ÷Ó÷½Í³Ò»Ô¼¶¨
---
## 4. ºËÐÄ API
### 4.1 ¹¹ÔìÓë½âÎö
```csharp
var cron = new Cron();
var ok = cron.Parse("0 */5 * * * *");
var cron2 = new Cron("0 */5 * * * *");
```
- `Parse` ·µ»Ø `false` ±íʾ±í´ïʽ·Ç·¨
- ¹¹Ô캯Êý `Cron(String expression)` ÄÚ²¿Ö±½Óµ÷Óà `Parse(expression)`
### 4.2 ÅжÏʱ¼äÊÇ·ñÃüÖУº`IsTime`
`IsTime` »áͬʱУÑ飺Ãë¡¢·Ö¡¢Ê±¡¢ÈÕ¡¢Ô¡¢ÖÜ¡£
```csharp
var cron = new Cron("0 0 2 * * 1-5");
var hit = cron.IsTime(DateTime.Parse("2026-01-09 02:00:00"));
```
ÖÜ×ֶΰüº¬ `#` ʱ£¬»¹»á½øÒ»²½Åжϡ°µÚ¼¸¸ö/µ¹ÊýµÚ¼¸¸öÖܼ¸¡±¡£
### 4.3 ÏÂÒ»´ÎÃüÖÐʱ¼ä£º`GetNext`
- ´Ó `time` µÄÏÂÒ»Ã뿪ʼ²éÕÒ£¨²»º¬ `time`£©
- Èô `time` ´øºÁÃ룬»áÏÈ `Trim()` ¶ÔÆëµ½Ã룬ÔÙ×öÆ«ÒÆ£¨±ÜÃâ¡°¸ÕºÃ¶ÔÆë¡±Ôì³ÉÖØ¸´ÃüÖУ©
- ×î¶à²éÕÒ 1 Ä꣬ʧ°Ü·µ»Ø `DateTime.MinValue`
```csharp
var cron = new Cron("5/20 * * * * *");
var next = cron.GetNext(DateTime.Today);
```
### 4.4 ÉÏÒ»´ÎÃüÖÐʱ¼ä£º`GetPrevious`
- ´Ó `time` ǰһÃ뿪ʼ·´Ïò²éÕÒ£¨²»º¬ `time`£©
- ×î¶à»ØËÝ 1 Ä꣬ʧ°Ü·µ»Ø `DateTime.MinValue`
```csharp
var cron = new Cron("0 */10 * * * *");
var prev = cron.GetPrevious(DateTime.Now);
```
### 4.5 ¶à±í´ïʽ£ºÈ¡×î½ü/×î½üÒ»´Î
```csharp
var arr = new[] { "0 */2 * * * *", "30 */5 * * * *" };
var next = Cron.GetNext(arr, DateTime.Now);
var prev = Cron.GetPrevious(arr, DateTime.Now);
```
---
## 5. ʾÀý
### 5.1 Ãë¼¶²½½ø
- `*/2`£ºÃ¿ 2 ÃëÒ»´Î
- `5/20`£ºÃ¿·ÖÖ 5/25/45 Ãë
### 5.2 ¹¤×÷ÈÕÁ賿 2 µã
```
0 0 2 * * 1-5
```
### 5.3 ÿÔÂµÚ 2 ¸öÐÇÆÚÈý
```
0 0 0 ? ? 3#2
```
> ¿É²Î¿¼²âÊÔ£º`XUnitTest.Core\Threading\CronTests.cs` ÖÐµÄ `dayweek_test`¡£
---
## 6. ³£¼ûÎÊÌâ
### 6.1 `?` µÄÓïÒå
±¾ÊµÏÖÖÐ `?` µÄ´¦Àí¸ü½Ó½ü `*`£¬²¢²»»áÏñ Quartz Cron ÄÇÑù¡°ºöÂÔ¸Ã×ֶΡ±¡£
Òò´Ë£¬Èç¹ûÄã´Ó Quartz ±í´ïÊ½Ç¨ÒÆ£¬ÇëÓÅÏÈʹÓà `*`¡¢·¶Î§¡¢²½½ø¡¢Ã¶¾Ù¡¢`#` µÈÃ÷ȷʵÏÖµÄÓï·¨¡£
### 6.2 `GetNext/GetPrevious` ÐÔÄÜ
`GetNext/GetPrevious` ͨ¹ýÖðÃë±éÀú²éÕÒÃüÖе㣬±í´ïʽԽϡÊè¡¢¾àÀëÔ½Ô¶£¬±éÀúÔ½¾Ã¡£
½¨Ò飺
- ²»ÒªÔÚ¸ßÆµÒµÎñÂß¼Öз´¸´µ÷ÓÃ
- ½«¼ÆËã·Åµ½µ÷¶È²ã£¨ÀýÈ綨ʱÆ÷³õʼ»¯¡¢ÈÎÎñÖ´ÐÐÍêºó¼ÆËãÏÂÒ»´Î£©
---
## 7. Ïà¹ØÁ´½Ó
- Îĵµ£º<https://newlifex.com/core/cron>
|