Vijf velden of zes
Standaard cron is minuut, uur, dag van de maand, maand, dag van de week. Quartz, ingebouwd in Spring en andere Java-frameworks, zet er een zesde veld voor seconden voor. Het dialect wordt afgeleid uit het aantal velden.
De tijdzone doet ertoe vanwege klokwisselingen. "Om 03:30" is in UTC een ander moment, afhankelijk van of de zomertijd die dag geldt, dus een schema op vaste lokale tijd moet je uitrekenen in de zone waarin mensen het lezen, niet in UTC en niet in wat er toevallig op een server staat.
De tabel met dialectondersteuning
Waar planners van elkaar verschillen. De meeste documentatie behandelt er één tegelijk.
| Symbool | Betekenis | Standaard cron | Quartz | AWS EventBridge |
|---|---|---|---|---|
* | elke waarde | ✓ | ✓ | ✓ |
, | lijst, bijv. 1,3,5 | ✓ | ✓ | ✓ |
- | bereik, bijv. 1-5 | ✓ | ✓ | ✓ |
/ | stap, bijv. een slash gevolgd door 15 | ✓ | ✓ | ✓ |
? | geen specifieke waarde, alleen dagvelden | × | ✓ | ✓ |
L | laatste dag van de maand, of laatste weekdag | × | ✓ | × |
# | zoveelste weekdag, bijv. de 3e vrijdag | × | ✓ | × |
W | dichtstbijzijnde weekdag bij een gegeven dag | × | ✓ | × |
Veelvoorkomende problemen
- Dag van de maand en dag van de week worden niet met AND gecombineerd. Het is een OR. De klassieke cron-verrassing: als ze allebei beperkt zijn, gaat het schema af zodra een van beide past, niet alleen als ze allebei passen.
0 0 1 * 1draait op de 1e van de maand en elke maandag, niet alleen op een maandag die toevallig de 1e is. Zet het veld waar het je niet om gaat op een wildcard, of in Quartz op?, om een gewone AND te krijgen. - "Beperkt" betekent dat de tekst niet met een ster begint. Cron kijkt naar het eerste teken van het veld, niet naar waar het op uitkomt, dus een stap als
0 0 */2 * MONtelt voor de regel hierboven als wildcard en doet een AND: elke tweede dag die ook een maandag is. Schrijf0 0 1-31/2 * MONvoor dezelfde verzameling dagen en dezelfde expressie doet ineens een OR. - Quartz nummert de dag van de week anders. Standaard cron loopt van 0 tot 6 met zondag als 0; Quartz loopt van 1 tot 7 met zondag als 1. Deze tool zet elke numerieke dag van de week in beide dialecten om naar 0 tot 6. Dagnamen schrijven (
MON,FRI) in een Quartz-expressie haalt de dubbelzinnigheid helemaal weg. - Een kloktijd rond een klokwisseling is dubbelzinnig. "01:30" op de dag dat de klok teruggaat gebeurt twee keer; "02:30" op de dag dat hij vooruitgaat gebeurt nooit. Elke planner lost dit anders op, dus kijk na wat de jouwe documenteert.
Len#zijn niet met een lijst te combineren.1,Lis ongeldig. Schrijf een aparte regel, of zet in Quartz?op het veld dat je niet beperkt.
Veelgestelde vragen
Waarom laat dezelfde expressie in een andere tijdzone een andere tijd zien?
Een cronveld is een kloktijd, geen moment, en droeg nooit een tijdzone. "Om 03:30" in Europe/Brussels en in America/New_York schelen uren. Kies de zone waarin het schema draait, niet per se je eigen zone.
Controleert dit mijn expressie tegen een echte planner?
Nee. Het volgt de gedocumenteerde grammatica's, inclusief de verschillen in de tabel hierboven, maar de planner waar je naartoe deployt heeft het laatste woord. Een zevende veld voor het jaar, dat sommige Quartz-voorbeelden gebruiken, wordt hier als ongeldig gemeld.
Hoe ver vooruit zoekt "volgende 10 runs"?
8 jaar, genoeg voor een schema dat één keer per jaar draait en genoeg om te voorkomen dat een onmogelijke expressie, zoals dag 31 vastgezet op februari, eeuwig doorzoekt.
In welke tijdzone draait het schema?
In die van de machine die het draait, en dat is verreweg de meest voorkomende cron-verrassing. Cron zelf heeft geen tijdzoneveld, dus een job die er lokaal goed uitziet gaat na een zomertijdwissel een uur te vroeg of te laat af, of draait in UTC op een server die je nooit hebt ingesteld. Kijk de TZ-variabele in de crontab of de configuratie van de planner na, en gebruik UTC voor alles wat gecoördineerd moet zijn.