Che cos'è questo strumento?
Un'espressione cron è una stringa di pianificazione compatta a cinque campi — `minuto ora giorno-del-mese mese giorno-della-settimana` — usata dal demone Unix `cron` e praticamente da ogni scheduler di job modellato su di esso (crontab, i CronJob di Kubernetes, il `schedule:` di GitHub Actions, Airflow, Jenkins). Ogni campo accetta un asterisco (`*`, che significa "qualsiasi valore"), un numero specifico, un elenco separato da virgole (`1,15,30`), un intervallo (`9-17`), uno step (`*/15`, che significa "ogni 15 unità") o — per mese e giorno della settimana — un nome di tre lettere (`JAN`, `MON`) al posto di un numero.
La definizione canonica di questa sintassi è la pagina man crontab(5) di Linux, che documenta esattamente gli stessi cinque campi, i caratteri speciali (`* , - /`) e le otto stringhe abbreviate con `@` (`@reboot`, `@yearly`/`@annually`, `@monthly`, `@weekly`, `@daily`/`@midnight`, `@hourly`) che la maggior parte delle implementazioni cron, incluso Vixie cron (la versione fornita sulla maggior parte delle distribuzioni Linux), supporta come alias per pianificazioni comuni.
Questo strumento implementa esattamente quel formato standard a 5 campi — il formato che inseriresti direttamente in `crontab -e` su un server Linux o macOS, o nel campo `schedule:` di un CronJob Kubernetes. Non implementa la sintassi Quartz cron, un formato diverso a 6 o 7 campi usato dallo Scheduler Quartz di Java e da alcuni strumenti di terze parti (vedi la sezione di confronto qui sotto per capire quando serve quello invece).
Perché usarlo?
- Hai appena ereditato un crontab di produzione con una riga come `17 3 * * 0` senza commenti che la spieghino — incollala qui prima di toccare qualsiasi cosa per scoprire che significa davvero "ogni domenica alle 3:17", non un refuso.
- Stai scrivendo un workflow GitHub Actions con un trigger cron `schedule:` e continui a chiederti se `0 */6 * * *` significhi davvero ogni 6 ore a partire da mezzanotte — controlla i prossimi 5 orari di esecuzione prima di fare il commit dello YAML.
- Hai impostato un cron job con sia una restrizione sul giorno del mese sia sul giorno della settimana, come `0 4 8 * MON`, e il job si attiva in giorni che non ti aspettavi — questo strumento mostra il comportamento di unione OR-non-AND che frega quasi tutti la prima volta.
- Stai costruendo un CronJob Kubernetes e ti serve la stringa `schedule:` esatta per "ogni 15 minuti, solo orario d'ufficio, giorni feriali" senza contare i campi a mano — usa il builder a menu a tendina invece di scriverla manualmente.
- Non sei sicuro se una configurazione di scheduler usi il cron standard o Quartz cron perché la documentazione dice solo "espressione cron" — controlla se ha 5 campi (questo strumento) o 6-7 campi con caratteri `?`/`L`/`W`/`#` (Quartz) prima di perdere tempo a debuggare un formato sbagliato.
- 100% lato client: la logica della tua pianificazione non lascia mai il tuo browser.
Come si usa
- Per tradurre un'espressione: digita o incolla una stringa cron a 5 campi (oppure un'abbreviazione @ come `@daily`) nel campo di input.
- Leggi la descrizione in linguaggio semplice e i prossimi 5 orari di esecuzione calcolati sotto di essa — entrambi si aggiornano in tempo reale mentre digiti.
- Per costruirne una: apri la sezione Builder, scegli una modalità (ogni / ogni N / valore specifico) per ciascuno dei cinque campi e clicca su "Genera espressione".
- L'espressione generata compare nel campo di input sopra e alimenta immediatamente i pannelli di descrizione e prossimi orari di esecuzione.
- Usa la legenda della sintassi in fondo alla pagina come riferimento rapido per `*`, `,`, `-` e `/`.
- Copia l'espressione finale con il pulsante Copia e incollala nel tuo crontab, nella configurazione CI o nello scheduler.
Esempio
Input
*/15 9-17 * * MON-FRIRisultato
Alle 09:00, 09:15, 09:30, 09:45, 10:00 ... 17:45, di lunedì, martedì, mercoledì, giovedì, venerdìQuesta espressione viene eseguita ogni 15 minuti, ma solo nell'intervallo orario 09:00–17:59, e solo nei giorni feriali — una tipica pianificazione di polling in "orario d'ufficio".
Cron standard vs Quartz cron
La "sintassi cron" non è un unico standard universale — i due formati che incontrerai più spesso differiscono per numero di campi e per il significato di alcuni caratteri speciali. Usa questa tabella per confermare di usare quello giusto per il tuo scheduler di destinazione.
| Aspetto | Cron standard (questo strumento) | Quartz cron |
|---|---|---|
| Numero di campi | 5 (minuto ora dom mese dow) | 6 o 7 (aggiunge i secondi, e l'anno opzionale) |
| Usato da | crontab Linux/macOS, CronJob Kubernetes, GitHub Actions | Scheduler Quartz di Java, alcuni scheduler enterprise |
| Giorno-del-mese e giorno-della-settimana entrambi impostati | Corrisponde a ENTRAMBI separatamente (unione/OR) | Richiede `?` in uno dei due campi — non è possibile impostare entrambi a un valore contemporaneamente |
| Caratteri speciali aggiuntivi | Nessuno oltre a `* , - /` | Aggiunge `?`, `L` (ultimo), `W` (giorno feriale più vicino), `#` (n-esimo giorno della settimana del mese) |
| Pianificazione a livello di secondi | Non supportata | Supportata (primo campo) |
Strumenti correlati
Lavori con configurazioni, pianificazioni o timestamp? Questi strumenti si abbinano bene al generatore di cron.
→ Convertitore di Timestamp · Convertitore Orologio Mondiale · Calcolatore di Date
Ricette di pianificazione comuni
Poche espressioni coprono la maggior parte delle esigenze di pianificazione reali — vale la pena riconoscerle a colpo d'occhio invece di ricavarle ogni volta da zero.
- `*/5 * * * *` — ogni 5 minuti, tutto il giorno. Comune per health check e job di polling leggeri.
- `0 */6 * * *` — ogni 6 ore, in punto (00:00, 06:00, 12:00, 18:00). Un default frequente per task di sincronizzazione o pulizia periodica.
- `0 2 * * *` — una volta al giorno alle 2 di notte. Lo slot classico per i backup notturni, quando il traffico è più basso.
- `0 9 * * 1-5` — alle 9, solo dal lunedì al venerdì. Standard per report o digest limitati all'orario d'ufficio.
- `0 0 1 * *` — mezzanotte del 1° di ogni mese, equivalente all'abbreviazione `@monthly`. Usato per esecuzioni di fatturazione mensile o reset di utilizzo.
- `*/15 9-17 * * MON-FRI` — ogni 15 minuti, ma solo durante l'orario d'ufficio nei giorni feriali — combina uno step, un intervallo e un intervallo di giorni della settimana in un'unica espressione.
Domande frequenti
Cos'è un'espressione cron?
Un'espressione cron è una stringa di testo a 5 campi (`minuto ora giorno-del-mese mese giorno-della-settimana`) che specifica una pianificazione ricorrente per il demone Unix `cron` e gli scheduler compatibili. Ogni campo può essere `*` (qualsiasi valore), un numero, un elenco separato da virgole, un intervallo (`a-b`) o uno step (`*/n`); i campi mese e giorno della settimana accettano anche nomi di tre lettere come `JAN` o `MON`. La specifica completa è documentata nella pagina man crontab(5).
Cosa succede quando sia giorno-del-mese sia giorno-della-settimana sono limitati?
Questo è un classico tranello di cron: secondo la semantica cron POSIX, quando ENTRAMBI i campi giorno-del-mese e giorno-della-settimana sono limitati (non `*`), un job viene eseguito se ALMENO UNA delle due condizioni è soddisfatta — è un'unione (OR), non un'intersezione (AND). Ad esempio, `0 4 8 * MON` viene eseguito alle 4 del mattino sia l'8 di ogni mese SIA ogni lunedì, non solo nei lunedì che capitano di cadere l'8. Questo strumento implementa esattamente questo comportamento di unione nel calcolo dei prossimi orari di esecuzione.
Cron standard o Quartz cron — quale mi serve?
Questo strumento genera la sintassi cron POSIX/Vixie standard a 5 campi — il formato usato dal `crontab` di Linux/macOS, dai CronJob di Kubernetes, dal `schedule:` di GitHub Actions e dalla maggior parte degli esecutori di job derivati da Unix. Quartz cron, usato dallo Scheduler Quartz di Java e dagli strumenti costruiti su di esso (alcuni scheduler enterprise, vecchie configurazioni Spring Batch), è un formato diverso a 6 o 7 campi che aggiunge un campo dei secondi iniziale e cambia il significato di alcuni caratteri speciali (`?` per "nessun valore specifico" nei campi giorno, `L`/`W`/`#` per "ultimo giorno", "giorno feriale più vicino" e "n-esimo giorno della settimana del mese"). Se il numero di campi del tuo scheduler è 6 o 7, o la sua documentazione menziona `?`, `L`, `W` o `#`, ti serve uno strumento specifico per Quartz — le espressioni generate qui non verranno interpretate correttamente. Se sono esattamente 5 campi (o un'abbreviazione tipo `@daily`), sei nel posto giusto.
Cosa significano le scorciatoie @yearly, @monthly, @weekly, @daily e @hourly?
Sono stringhe abbreviate non standard ma ampiamente supportate che si espandono in comuni espressioni a 5 campi: `@yearly`/`@annually` = `0 0 1 1 *` (una volta all'anno, il 1° gennaio a mezzanotte), `@monthly` = `0 0 1 * *` (il 1° di ogni mese a mezzanotte), `@weekly` = `0 0 * * 0` (ogni domenica a mezzanotte), `@daily`/`@midnight` = `0 0 * * *` (ogni giorno a mezzanotte), `@hourly` = `0 * * * *` (all'inizio di ogni ora). Questo strumento le interpreta tutte e le tratta esattamente come il loro equivalente espanso a 5 campi.
Posso usare i nomi di giorni/mesi invece dei numeri?
Sì. Il campo mese accetta nomi di tre lettere da `JAN` a `DEC`, e il campo giorno-della-settimana accetta da `SUN` a `SAT` (senza distinzione tra maiuscole e minuscole), in modo intercambiabile con i numeri. I numeri del giorno-della-settimana vanno da 0 a 6 con 0 = domenica; alcune implementazioni accettano anche 7 per domenica, che questo strumento normalizza a 0. Anche intervalli ed elenchi funzionano con i nomi, ad esempio `MON-FRI` o `JAN,JUN,DEC`.
La mia espressione cron viene inviata a un server?
No. L'analisi, la descrizione in linguaggio semplice e il calcolo dei prossimi orari di esecuzione avvengono tutti localmente in JavaScript nel tuo browser. Nulla di ciò che digiti o generi lascia mai il tuo dispositivo.
In quale fuso orario vengono calcolati i prossimi orari di esecuzione?
Questo strumento calcola i prossimi orari di esecuzione usando il fuso orario locale del tuo browser, dato che il cron standard non ha un campo fuso orario integrato — il demone o scheduler reale che esegue il tuo job usa qualunque fuso orario sia impostato sul sistema host (o, per GitHub Actions e scheduler cloud simili, UTC). Se il fuso orario del tuo server differisce da quello del tuo browser, sposta mentalmente gli orari mostrati, oppure controlla separatamente la configurazione del fuso orario del tuo scheduler.
Come pianifico un job da eseguire solo l'ultimo giorno del mese?
Il cron standard a 5 campi non ha una sintassi diretta per "ultimo giorno del mese" — è una delle funzionalità che Quartz cron aggiunge con il suo carattere `L`. Nel cron standard, la soluzione comune è pianificare il job dal 28 al 31 di ogni giorno (`0 0 28-31 * *`) e far controllare allo script stesso se la data di domani passa a un nuovo mese prima di eseguire effettivamente la sua logica.
Posso pianificare qualcosa a un intervallo insolito, come ogni 10 minuti?
Sì, usando la sintassi step: `*/10 * * * *` viene eseguito ogni 10 minuti a partire da :00 (quindi a :00, :10, :20, :30, :40, :50). Tieni presente che gli step iniziano sempre a contare dal valore minimo del campo, quindi `*/10` nel campo minuti non cadrà mai su :05 o :15 — se ti serve uno sfasamento del genere, usa invece un elenco esplicito separato da virgole, ad esempio `5,15,25,35,45,55`.
Perché il mio cron job sembra eseguirsi due volte insieme, o non eseguirsi affatto, intorno a un cambio dell'ora legale?
Il cron standard pianifica in base all'orario del sistema host, e le transizioni dell'ora legale creano o un'ora saltata (avanti in primavera) o un'ora ripetuta (indietro in autunno). Un job pianificato durante l'ora saltata o ripetuta può eseguirsi zero o due volte quel giorno a seconda di come il tuo demone cron gestisce nello specifico la situazione. Eseguire job di infrastruttura critici su server impostati su UTC (che non ha ora legale) evita completamente questo problema.