Skip to content

Generatore Crontab e Costruttore di Espressioni Cron

Genera, valida e decodifica espressioni cron online nel browser. Anteprima live delle prossime esecuzioni in ora locale o UTC. Sintassi POSIX a 5 campi, preset e descrizione in italiano.

Niente tracciamento Funziona nel browser Gratuito
Tutto il parsing e il calcolo delle prossime esecuzioni avviene localmente nel tuo browser. Nessun dato viene inviato ad alcun server.

Campi
Preset

Descrizione leggibile

Prossime 5 esecuzioni pianificate

Fuso orario per l'anteprima delle prossime esecuzioni
    Revisionato per conformità POSIX a 5 campi, correttezza della semantica OR, ancoraggio dell'operatore passo, espansione dei token nominati e rifiuto degli operatori Quartz con errori utili — Team Engineering di Go Tools · May 20, 2026

    Cos'è un'espressione cron?

    Un'espressione cron è una stringa a cinque campi che definisce una pianificazione ricorrente. Da sinistra a destra, i campi sono minuto (0-59), ora (0-23), giorno del mese (1-31), mese (1-12) e giorno della settimana (0-6, dove sia 0 sia 7 indicano domenica). Ogni campo accetta un valore, una lista (`1,3,5`), un intervallo (`1-5`), una wildcard (`*` con significato "qualsiasi valore") o un passo (`*/15` con significato "ogni 15"). La combinazione definisce esattamente quando il comando pianificato verrà eseguito — `0 9 * * 1-5` per esempio si legge "al minuto 0, ora 9, qualunque giorno del mese, qualunque mese, giorno della settimana da lunedì a venerdì" — in italiano, "giorni feriali alle 9:00".

    Cron è nato in Unix Versione 7 nel 1979 e la grammatica a cinque campi è rimasta essenzialmente invariata per oltre quattro decenni — una testimonianza di quanto sia ben progettata la sintassi originale. Oggi le espressioni cron sono usate ben oltre il file crontab Unix: i CronJob di Kubernetes, i workflow di GitHub Actions, le regole di AWS EventBridge, le pipeline pianificate di GitLab CI, i Cron Triggers di Cloudflare Workers e le piattaforme serverless di ogni cloud accettano tutti la stessa grammatica a cinque campi. Imparare cron una volta significa sapere come pianificare job in ogni contesto infrastrutturale moderno.

    Lo standard POSIX definisce cinque operatori: `*` (qualsiasi valore), `,` (lista di valori), `-` (intervallo), `/` (passo) e i token nominati per i mesi (JAN-DEC) e i giorni della settimana (SUN-SAT). La maggior parte delle implementazioni espande inoltre cinque scorciatoie comuni: `@yearly` (`0 0 1 1 *`), `@monthly` (`0 0 1 * *`), `@weekly` (`0 0 * * 0`), `@daily` (`0 0 * * *`) e `@hourly` (`0 * * * *`). Lo scheduler Quartz (una libreria Java) estende tutto questo con un campo secondi opzionale e operatori aggiuntivi (`?`, `L`, `W`, `#`) — utile se lavori in Java/Spring, ma non portabile al cron standard. Questo strumento segue lo standard POSIX a cinque campi perché è la variante dominante e quella che il tuo server Linux, il runner di GitHub Actions e il cluster Kubernetes capiranno davvero.

    Una stranezza del cron POSIX merita attenzione speciale: quando sia il giorno del mese sia il giorno della settimana sono ristretti (nessuno dei due è `*`), la pianificazione viene eseguita se UNO O L'ALTRO corrisponde — semantica OR, non AND. Quindi `0 0 1 * 5` parte il primo di ogni mese E ogni venerdì, non solo i venerdì che cadono il primo. È la sorpresa più comune di cron; l'anteprima delle prossime esecuzioni in questo strumento la rende ovvia mostrando le date e le ore esatte in cui la pianificazione partirà. Verifica prima del deploy.

    Tutto il parsing e il calcolo delle prossime esecuzioni avviene interamente nel tuo browser tramite JavaScript — nessuna espressione, pianificazione o altro dato viene mai inviato a un server. Questo strumento analizza qualunque espressione cron POSIX standard all'istante con una descrizione in italiano e un'anteprima di cinque esecuzioni, con privacy completa.

    Le espressioni cron sono strettamente legate ad altri strumenti per sviluppatori. I cron job vengono comunemente debuggati confrontando gli Unix timestamp con gli orari di esecuzione attesi, e le pianificazioni complesse vengono spesso documentate come configurazioni JSON che puoi validare con il nostro formattatore JSON. Per una guida approfondita che copre la semantica OR, le insidie dei fusi orari e le varianti comuni di cron con esempi in Linux, Kubernetes e GitHub Actions, leggi il nostro riferimento sulle pianificazioni cron.

    # Linux crontab entry — runs every 15 minutes
    */15 * * * *  /usr/local/bin/poll-api.sh
    
    # Kubernetes CronJob — weekdays at 9:00 AM UTC
    apiVersion: batch/v1
    kind: CronJob
    metadata:
      name: daily-report
    spec:
      schedule: "0 9 * * 1-5"
      timeZone: "UTC"
      jobTemplate:
        spec:
          template:
            spec:
              containers:
                - name: report
                  image: report-runner:1.0
              restartPolicy: OnFailure
    
    # GitHub Actions workflow — hourly
    on:
      schedule:
        - cron: '0 * * * *'
    
    # AWS EventBridge — first of each month
    ScheduleExpression: cron(0 0 1 * ? *)
    # (Note: AWS uses the Quartz 6-field form with '?' for day-of-week)

    Caratteristiche principali

    Parser POSIX a 5 campi in tempo reale

    Parser rigoroso che segue cron POSIX: minuto (0-59), ora (0-23), giorno del mese (1-31), mese (1-12 o JAN-DEC), giorno della settimana (0-6 o SUN-SAT, con 7 accettato come domenica). Tutti gli operatori standard (`*` `,` `-` `/`) e le macro (`@yearly` `@monthly` `@weekly` `@daily` `@hourly`) supportati.

    Anteprima delle prossime 5 esecuzioni

    Calcola gli orari delle prossime cinque esecuzioni a partire dalla tua ora locale corrente. Passa tra Locale e UTC con un clic — il modo più affidabile per cogliere sorprese di fuso orario prima di deployare un crontab su un server in un'altra regione.

    Descrizione in linguaggio naturale

    Ogni espressione valida riceve una spiegazione leggibile: "Ogni 15 minuti", "Giorni feriali alle 9:00", "Alle 02:30 del giorno 1 del mese, a gennaio e luglio". Rende code review e passaggi di consegne immediati — non dovrai più indovinare cosa faccia davvero `*/5 9-17 * * 1-5`.

    Messaggi di errore a livello di campo

    Le espressioni non valide ricevono un feedback rosso istantaneo con il campo problematico evidenziato e un errore specifico: "Errore in minuto: valore fuori intervallo [0, 59]: "60"". Niente più fallimenti silenziosi del crontab scoperti tre giorni dopo quando il report non è partito.

    Chip preset per pianificazioni comuni

    Undici preset a un clic coprono le pianificazioni che userai davvero: ogni minuto, ogni 5/15 minuti, ogni ora, ogni giorno a mezzanotte o alle 9, giorni feriali alle 9, settimanale di domenica/lunedì, primo di ogni mese e annuale. Tocca, ritocca, deploya.

    Input per costruire campo per campo

    Non memorizzare l'ordine dei cinque campi — cinque piccoli input etichettati Minuto, Ora, Giorno del mese, Mese, Giorno della settimana ti permettono di modificare una posizione alla volta senza perdere un valore o invertire l'ordine. L'espressione completa in alto si ricostruisce automaticamente.

    Semantica OR POSIX gestita correttamente

    Quando sia il giorno del mese sia il giorno della settimana sono ristretti, scatta la regola OR — `0 0 1 * 5` parte ogni 1° E ogni venerdì. L'anteprima delle prossime esecuzioni rende tutto questo visibile prima del deploy; niente più pagine a sorpresa nel weekend.

    Privacy: 100% nel browser

    Le tue espressioni cron — che spesso rivelano la temporizzazione dell'infrastruttura e i pattern di pianificazione interna — non lasciano mai il tuo browser. Nessun dato viene inviato ad alcun server, nessun log, nessun analytics. Puoi verificarlo nella scheda Network del tuo browser. Sicuro per pianificazioni di produzione e sistemi interni.

    Messaggi di errore consapevoli di Quartz

    Se incolli un'espressione Quartz con `?` `L` `W` o `#`, il parser spiega "Operatori Quartz non supportati — usa la sintassi POSIX" così sai di doverla riscrivere per cron invece di debuggare un fallimento silenzioso. Le pianificazioni Quartz non girano su cron Linux.

    Varianti di cron e scheduler

    Vixie cron (default Linux)

    POSIX a 5 campi

    Il default sulla maggior parte delle distribuzioni Linux. POSIX rigoroso con l'estensione `CRON_TZ=` per il fuso orario esplicito. La semantica OR su giorno del mese / giorno della settimana si applica. Il target principale di questo strumento.

    BSD cron

    POSIX a 5 campi

    Default su macOS e famiglia BSD. Compatibile POSIX con piccole differenze implementative rispetto a vixie cron; la maggior parte delle espressioni funziona in modo identico.

    Timer systemd (OnCalendar)

    specifica calendario, non cron

    Alternativa a cron su Linux basato su systemd. Usa la sintassi `OnCalendar: 2026-*-* 09:00:00` — più leggibile per pianificazioni non ricorrenti ma non interoperabile con le espressioni cron.

    Quartz Scheduler (Java/Spring)

    6 o 7 campi

    Aggiunge i campi secondi (obbligatorio) e anno (opzionale), più gli operatori `?`, `L`, `W`, `#`. Utile per applicazioni Java ma non portabile al cron Linux.

    AWS EventBridge

    Quartz a 6 campi con `?`

    Richiede che il giorno della settimana o il giorno del mese sia `?` (convenzione Quartz) anziché `*` quando solo uno è ristretto. Le espressioni non sono portabili direttamente al cron Linux.

    Kubernetes CronJob

    POSIX a 5 campi + campo timeZone

    Pianificazione POSIX a 5 campi più campo `spec.timeZone` (1.27+). Più pulito che affidarsi al fuso orario dell'host del kubelet. Le espressioni sono portabili direttamente dal cron Linux.

    GitHub Actions

    POSIX a 5 campi

    Gira sempre in UTC. Tempistiche best-effort — possono essere saltate sotto carico elevato. Evita intervalli inferiori a 15 minuti. Le espressioni sono portabili direttamente dal cron Linux.

    Esempi di espressioni cron

    Ogni 15 minuti

    */15 * * * *

    Operatore passo: `*/15` nel campo dei minuti significa "ogni 15 minuti a partire dal minuto 0" — quindi le esecuzioni avvengono a :00, :15, :30, :45 di ogni ora di ogni giorno. L'intervallo più comune per il polling di API, l'aggiornamento delle cache e i controlli di heartbeat.

    Giorni feriali alle 9:00

    0 9 * * 1-5

    L'intervallo `1-5` nel campo del giorno della settimana indica da lunedì a venerdì (1=lun, 5=ven). Viene eseguito esattamente alle 09:00 — utile per report in orario lavorativo, job batch che dipendono da dati notturni e promemoria di standup giornalieri.

    Primo del mese a mezzanotte

    0 0 1 * *

    Giorno del mese `1`, tutti gli altri campi inferiori a zero. Comune per fatturazione mensile, rotazione dei log e riconciliazione di fine periodo. Giorno del mese e giorno della settimana sono entrambi ristretti solo quando nessuno dei due è `*` — qui il giorno della settimana è `*`, quindi conta solo il giorno del mese.

    Ogni 5 minuti tra le 9 e le 17, giorni feriali

    */5 9-17 * * 1-5

    Combina il passo (`*/5`) con un intervallo (`9-17`) su campi diversi. Utile per monitoraggio limitato all'orario lavorativo o svuotamento di code. Totale: 12 esecuzioni/ora × 9 ore × 5 giorni = 540 esecuzioni a settimana lavorativa.

    Trimestrale: il 1° di gen, apr, lug, ott a mezzanotte

    0 0 1 JAN,APR,JUL,OCT *

    Mesi nominati in una lista separata da virgole. Pianificazioni trimestrali come chiusura finanziaria, revisioni di code-freeze o audit di conformità. Puoi mescolare nomi e numeri (`1,APR,7,10` viene interpretato allo stesso modo), ma mantieni un unico stile per leggibilità.

    Trabocchetto OR POSIX: 1° del mese O ogni venerdì

    0 0 1 * 5

    Quando SIA il giorno del mese (`1`) SIA il giorno della settimana (`5`) sono ristretti, cron POSIX esegue il job se UNO O L'ALTRO corrisponde. Quindi parte il 1° di ogni mese E ogni venerdì — non solo i venerdì che cadono il primo. È la sorpresa più comune di cron; l'anteprima delle prossime esecuzioni la rende ovvia.

    Ogni giorno alle 02:30 (finestra a basso traffico)

    30 2 * * *

    Valori specifici sia per l'ora sia per il minuto, wildcard altrove. La finestra 02:00-04:00 UTC è la convenzione di fatto per i job batch notturni perché non si sovrappone all'orario lavorativo di nessuna grande area economica. Combina con il toggle UTC per confermare che l'esecuzione avvenga dove ti aspetti.

    Equivalente macro: @daily

    @daily

    La scorciatoia `@daily` (anche `@midnight`) si espande in `0 0 * * *` — ogni giorno a mezzanotte. Altre macro: `@yearly` = `0 0 1 1 *`, `@monthly` = `0 0 1 * *`, `@weekly` = `0 0 * * 0`, `@hourly` = `0 * * * *`. Le macro sono concise, ma la forma a cinque campi è più portabile tra scheduler diversi (alcuni supportano le macro, altri no).

    Come costruire un'espressione cron

    1. 1

      Scrivi o incolla un'espressione cron

      Inserisci un'espressione cron a cinque campi nel campo qui sopra (es. `*/15 * * * *`). Lo strumento analizza e valida mentre digiti — spunta verde se valida, errore rosso con il nome del campo se non valida. Sono accettate anche le macro come `@daily`, `@hourly`, ecc.

    2. 2

      Oppure modifica i cinque campi

      Non memorizzare l'ordine dei campi — modifica Minuto, Ora, Giorno del mese, Mese o Giorno della settimana singolarmente tramite gli input etichettati. L'espressione completa in alto si aggiorna automaticamente. Usa `*` per le wildcard, `*/N` per i passi, `a-b` per gli intervalli e `1,3,5` per le liste.

    3. 3

      Scegli un preset per partire

      Tocca un qualunque chip preset (Ogni 15 minuti, Giorni feriali alle 9, ecc.) per caricare una pianificazione comune, poi adatta i campi alle tue esigenze. Undici preset coprono i pattern che userai davvero in produzione.

    4. 4

      Verifica l'anteprima delle prossime esecuzioni

      Guarda le cinque date e ore di esecuzione imminenti — passa tra Locale e UTC per confermare che la pianificazione parta quando intendi. È il modo più affidabile per cogliere il trabocchetto OR POSIX del giorno del mese/giorno della settimana prima che ti morda in produzione.

    5. 5

      Copia e incolla nel tuo scheduler

      Clicca su Copia per prendere l'espressione. Incolla nel tuo crontab, in un timer systemd, nel `cron:` di GitHub Actions, in AWS EventBridge, nello `schedule` di un Kubernetes CronJob o in qualunque scheduler compatibile con cron. Non dimenticare di verificare il fuso orario dello scheduler target — vedi la sezione Best practice qui sotto.

    Errori comuni di cron

    Trabocchetto OR POSIX: entrambi i campi giorno ristretti

    Quando SIA il giorno del mese SIA il giorno della settimana sono ristretti, cron POSIX esegue il job se UNO O L'ALTRO corrisponde — non entrambi. Quindi `0 0 1 * 5` parte il primo di ogni mese E ogni venerdì, non solo i venerdì-che-cadono-il-1°. Usa `*` in uno dei due campi giorno quando vuoi una sola condizione, oppure scrivi uno script wrapper che fa il controllo AND.

    ✗ Errato
    # Intenzione: "primo venerdì del mese"
    0 0 1-7 * 5
    # In realtà: parte nei giorni 1-7 del mese O ogni venerdì — entrambe le condizioni
    ✓ Corretto
    # Usa un wrapper per vera semantica AND
    0 0 * * 5  [ $(date +\%d) -le 7 ] && /tuo-script
    # OPPURE elimina una condizione e accetta la pianificazione più ampia

    Deriva di fuso orario tra dev e produzione

    Le pianificazioni cron su un server Linux usano il fuso orario di sistema, non quello locale di chi le scrive. Un cron alle 9:00 su un server impostato su UTC parte alle 4 del mattino US East. Progetta sempre le pianificazioni rispetto al fuso orario del server target — preferibilmente UTC — e fissa il fuso orario esplicitamente con `CRON_TZ=...` in cima al crontab.

    ✗ Errato
    # Scritto da uno sviluppatore US East, deployato su server UTC
    0 9 * * *  /tuo-report.sh
    # Parte alle 9 UTC = 4 del mattino US East — non quello che intendeva lo sviluppatore
    ✓ Corretto
    # Fissa il fuso orario, oppure scrivi in UTC esplicitamente
    CRON_TZ=America/New_York
    0 9 * * *  /tuo-report.sh

    Confusione sull'operatore passo: '*/15' vs '15'

    `*/15` nel minuto significa "ogni 15 minuti a partire da 0" (quindi 0, 15, 30, 45). Solo `15` significa "solo al minuto 15" — un'esecuzione all'ora. I principianti spesso scrivono `15` pensando che sia ogni 15 minuti; la descrizione in linguaggio naturale dello strumento rende l'errore ovvio prima del deploy.

    ✗ Errato
    # Intenzione: ogni 15 minuti
    15 * * * *
    # In realtà: una volta all'ora, al minuto 15 (4 esecuzioni/ora in meno dell'intenzione)
    ✓ Corretto
    # Corretto
    */15 * * * *
    # Ogni 15 minuti: minuto 0, 15, 30, 45 di ogni ora

    Espressione a sei campi su scheduler POSIX

    Quartz/Spring/node-cron supportano un campo secondi opzionale come prima posizione. Crontab Linux, GitHub Actions, AWS EventBridge (perlopiù) e Kubernetes CronJob NON lo supportano — si aspettano cinque campi. Incollare un'espressione a sei campi rompe silenziosamente la pianificazione: i tuoi secondi diventano minuti, i minuti diventano ore, ecc.

    ✗ Errato
    # Quartz a 6 campi copiato in crontab Linux
    0 0 9 * * 1-5
    # Linux legge: minuto=0, ora=0, dom=9, mese=*, dow=1-5
    # = mezzanotte nei giorni 9 nei mesi che corrispondono ai giorni feriali — caos
    ✓ Corretto
    # POSIX a 5 campi, elimina i secondi
    0 9 * * 1-5
    # = giorni feriali alle 9:00

    Giorno del mese fuori intervallo per il mese

    Cron non valida il giorno del mese rispetto al mese effettivo. `0 0 31 2 *` (31 febbraio) viene interpretato senza errori ma non corrisponde mai — febbraio ha al massimo 29 giorni. I principianti danno per scontato che il parser intercetti questo; non lo fa. L'anteprima delle prossime esecuzioni in questo strumento mostra "Nessuna esecuzione" quando un'espressione è strutturalmente valida ma logicamente impossibile.

    ✗ Errato
    # 30 o 31 febbraio — non parte mai
    0 0 30 2 *
    0 0 31 2 *
    # Si interpreta ma nessuna pianificazione parte mai
    ✓ Corretto
    # Usa il pattern 'ultimo giorno feriale di febbraio' tramite script
    0 0 28-29 2 *  [ $(date -d tomorrow +\%m) = 03 ] && /tuo-script

    Confondere la sintassi Quartz con POSIX

    La documentazione AWS, i tutorial di Spring e molte risposte di Stack Overflow mostrano espressioni cron Quartz con `?`, `L`, `W` o `#`. Queste non funzionano nel crontab Linux. Se copi un'espressione a sei campi con `?` nello slot del giorno della settimana, il parser Linux la rifiuta (o peggio, la interpreta silenziosamente in modo sbagliato). Questo strumento intercetta gli operatori Quartz e spiega la differenza.

    ✗ Errato
    # Quartz: 'ultimo venerdì del mese' — non valido in POSIX
    0 0 ? * 6L *
    ✓ Corretto
    # Approccio POSIX con script wrapper per ultimo-venerdì
    0 0 25-31 * 5  /tuo-script
    # Parte di venerdì tra il 25 e il 31 di qualunque mese

    Casi d'uso comuni

    Job di crontab Linux
    Costruisci e verifica le voci per `/etc/crontab`, `/etc/cron.d/*` o i file `crontab -e` per utente. Usa l'anteprima delle prossime esecuzioni per confermare che la pianificazione cada all'orario giusto nel fuso orario configurato del tuo server prima di salvare.
    Pianificazioni di Kubernetes CronJob
    Genera il campo `spec.schedule` per un CronJob Kubernetes. Kubernetes 1.27+ supporta anche `spec.timeZone` — usa il toggle UTC per progettare la pianificazione in UTC, poi imposta esplicitamente `timeZone` per evitare l'ora locale del worker node.
    Workflow pianificati di GitHub Actions
    Costruisci la voce `cron:` sotto `on.schedule`. GitHub Actions gira sempre in UTC — passa l'anteprima a UTC per confermare la pianificazione. Evita intervalli inferiori a 15 minuti; lo scheduler di GitHub salta i job a intervalli brevi sotto carico.
    Regole di AWS EventBridge
    Componi l'espressione cron per una regola pianificata di EventBridge. Nota: AWS usa la sintassi Quartz a sei campi con `?` per il giorno della settimana — questo strumento emette POSIX a cinque campi, che dovrai convertire anteponendo i secondi (`0`) e sostituendo il `*` in uno dei due campi giorno con `?`.
    Pipeline pianificate di GitLab CI
    Verifica l'espressione cron per una pipeline CI pianificata in GitLab. GitLab usa la sintassi POSIX a cinque campi — quella che emette questo strumento — e un date picker nell'interfaccia, ma la forma cron ti dà controllo più fine per intervalli non standard.
    Cron Triggers di Cloudflare Workers
    Costruisci la voce `[triggers.crons]` in `wrangler.toml`. Cloudflare usa la sintassi POSIX a cinque campi. L'intervallo minimo è di un minuto; il worker gira in UTC. Usa l'anteprima per verificare che il trigger parta entro la finestra prevista.
    Pianificazioni node-cron in Node.js
    Costruisci espressioni per la libreria `node-cron`, che supporta sia POSIX a cinque campi sia un campo secondi iniziale opzionale. Resta sui cinque campi a meno che ti serva precisione sub-minuto — le espressioni a sei campi non sono portabili al crontab Linux.
    Code review e documentazione
    Incolla un'espressione cron da una PR o da un runbook per vedere subito cosa fa — niente più indovinelli su `30 7 * * 1-5` o consultazioni di schede di riferimento. La descrizione in linguaggio naturale è ottima anche per commenti inline e file README.

    Riferimento sintassi cron

    Ordine dei campi: M H D M W
    Minuto (0-59), Ora (0-23), Giorno del mese (1-31), Mese (1-12), Giorno della settimana (0-6, 7 = anche domenica). Il campo del giorno della settimana accetta sia token numerici (0-6) sia nominati (SUN-SAT, non sensibili al maiuscolo/minuscolo).
    Operatori
    `*` = qualsiasi valore; `,` = separatore di lista (`1,3,5`); `-` = intervallo (`1-5`); `/` = passo (`*/15`, `5/10`); nomi: JAN-DEC per il mese, SUN-SAT per il giorno della settimana (non sensibili al maiuscolo/minuscolo).
    Macro (alias)
    `@yearly` = `0 0 1 1 *`; `@annually` = `0 0 1 1 *`; `@monthly` = `0 0 1 * *`; `@weekly` = `0 0 * * 0`; `@daily` = `0 0 * * *`; `@midnight` = `0 0 * * *`; `@hourly` = `0 * * * *`. `@reboot` è una non-pianificazione speciale (parte solo al boot) e viene rifiutata con un errore esplicativo.
    Semantica dei giorni POSIX (regola OR)
    Quando SIA il giorno del mese SIA il giorno della settimana sono ristretti (nessuno dei due è `*`), la pianificazione viene eseguita se UNO O L'ALTRO corrisponde — semantica OR. Quando solo uno è ristretto, decide quello. Quando entrambi sono `*`, ogni giorno corrisponde. Questa regola OR si applica a vixie cron, BSD cron e alla maggior parte delle implementazioni POSIX; Quartz usa `?` per disambiguare AND vs OR.
    Modalità a sei campi (Quartz-lite)
    Se il tuo input ha sei token separati da spazi, lo strumento tratta il primo come campo secondi (0-59). Utile per Quartz, Spring `@Scheduled(cron=...)` e node-cron. NON portabile al crontab Linux o agli scheduler POSIX — tratterebbero i tuoi secondi come minuti e sposterebbero tutto di una posizione.
    Ancoraggio dell'operatore passo
    `*/N` è ancorato al valore più basso del campo: `*/15` nel minuto = `0,15,30,45`, non "ogni 15 a partire da ora". Con una base non-wildcard: `5/15` nel minuto = `5,20,35,50`. I valori di passo che non dividono uniformemente l'intervallo del campo salteranno vicino al wraparound — è corretto, non un bug.
    Limiti di validazione
    minuto ∈ [0,59], ora ∈ [0,23], giorno del mese ∈ [1,31], mese ∈ [1,12], giorno della settimana ∈ [0,7]. I valori fuori intervallo producono un errore a livello di campo. Il giorno del mese NON viene validato rispetto al mese (`0 0 31 2 *` viene interpretato senza errori ma non corrisponde mai perché febbraio non ha il giorno 31 — l'anteprima delle prossime esecuzioni mostrerà "Nessuna esecuzione").
    Operatori Quartz rifiutati
    Cron POSIX non supporta gli operatori Quartz `?` (nessun valore specifico), `L` (last), `W` (giorno feriale più vicino) o `#` (n-esimo giorno della settimana). Questo strumento li rifiuta con un chiaro messaggio "Operatori Quartz non supportati" invece di analizzarli silenziosamente come POSIX non valido. Per pianificazioni Quartz, usa uno strumento consapevole di Quartz o lo scheduler di Spring.
    Limite annuale sulla ricerca delle prossime esecuzioni
    Il calcolo delle prossime esecuzioni cerca fino a 4 anni in avanti; le espressioni che corrispondono meno spesso (es. pattern "29 febbraio") mostreranno "Nessuna esecuzione nei prossimi 4 anni". È una scelta progettuale per evitare iterazioni illimitate su pattern impossibili.

    Best practice per le pianificazioni cron

    Usa UTC sui server, converti al momento della visualizzazione
    Imposta i tuoi server su UTC (`/etc/timezone` o `TZ=UTC`) e scrivi tutte le espressioni cron in UTC. Converti in ora locale solo al momento della visualizzazione nelle dashboard e nei report. Questo elimina un'intera categoria di bug di fuso orario che colpiscono più duramente durante le transizioni dell'ora legale, quando le pianificazioni in ora locale partono silenziosamente due volte o saltano un'esecuzione. Usa il toggle UTC in questo strumento per progettare la pianificazione in UTC fin dall'inizio.
    Evita il trabocchetto OR POSIX di giorno del mese/giorno della settimana
    Non restringere mai sia il giorno del mese SIA il giorno della settimana se non vuoi la semantica OR. Se vuoi "ogni lunedì di gennaio", scrivi `0 0 * 1 1` (il giorno del mese è `*`); se vuoi "il primo di ogni mese", scrivi `0 0 1 * *` (il giorno della settimana è `*`). La regola OR POSIX fa sì che `0 0 1 * 1` parta il 1° E ogni lunedì — quasi sicuramente non quello che intendevi. L'anteprima delle prossime esecuzioni cattura questo se controlli prima del deploy.
    Fissa esplicitamente il fuso orario della pianificazione
    Gli scheduler moderni supportano il pinning del fuso orario nella definizione della pianificazione: `CRON_TZ=America/New_York` in cima a un crontab (vixie cron 3.0+), `spec.timeZone: "America/New_York"` per Kubernetes CronJobs 1.27+, espressione di pianificazione con `ScheduleExpressionTimezone` per AWS EventBridge Scheduler. Fissa il fuso orario esplicitamente invece di affidarti al default del server — i fusi orari dei server possono cambiare senza preavviso durante migrazioni infrastrutturali.
    Distribuisci il carico tra i minuti, non a :00
    Evita `0 * * * *` (ogni ora al minuto 0) per i job non critici — a scala, pianificare molte cose esattamente a :00 crea picchi di carico. Scegli un offset casuale di minuti (`23 * * * *`, `41 * * * *`) per ogni job per distribuire il carico. Lo stesso vale per i job giornalieri: `30 3 * * *` è più gentile col tuo database di `0 3 * * *` quando molti job convergono alle 3:00.
    Rendi i job idempotenti
    Cron non ha retry integrato, prevenzione di sovrapposizioni o recupero di esecuzioni perse. Il tuo job dovrebbe poter essere eseguito più volte in sicurezza (idempotente) e auto-controllarsi. Invece di "invia report alle 9", progettalo come "invia il report di oggi se non già inviato" — così si auto-ripara dopo downtime, doppie pianificazioni accidentali ed esecuzioni concorrenti. L'idempotenza è una proprietà del job, non dello scheduler, ed è la singola pratica di affidabilità più importante.
    Aggiungi un heartbeat per le pianificazioni critiche
    Il fallimento silenzioso è la debolezza più grande di cron — se la pianificazione non parte, niente te lo dice. Per i job critici, fai sì che il job invii un ping a un servizio di heartbeat (Healthchecks.io, Cronitor, Dead Man's Snitch) alla fine di ogni esecuzione; il servizio ti avvisa se il ping atteso non arriva. Questo cattura sia il job che fallisce sia la pianificazione stessa che parte male. Il piano gratuito copre la maggior parte delle esigenze personali e di piccoli team.
    Verifica con l'anteprima delle prossime esecuzioni prima di rilasciare
    Prima di deployare una nuova pianificazione cron, guarda le cinque date e ore di esecuzione imminenti nell'anteprima di questo strumento. Passa tra Locale e UTC. Conferma che la pianificazione cada quando intendi — non cinque minuti prima, non nel giorno sbagliato, non saltando il weekend che ti interessava. L'anteprima è il test di produzione meno costoso possibile.

    Domande frequenti

    Cosa fa questo strumento?
    Analizza, valida e spiega le espressioni cron nel tuo browser, con un'anteprima live delle prossime cinque esecuzioni nel tuo fuso orario o in UTC. Scrivi una qualunque espressione cron standard POSIX a cinque campi — oppure usa i chip preset e i campi per posizione per costruirne una senza memorizzare la sintassi — e lo strumento produce una descrizione in linguaggio naturale ("Ogni 15 minuti", "Giorni feriali alle 9:00", ecc.) più le date e ore esatte in cui il job partirà. Le espressioni sbagliate vengono intercettate all'istante con un messaggio di errore a livello di campo, così non sprechi un deploy su una pianificazione rotta. L'intero strumento gira al 100% lato client: niente viene caricato, registrato o memorizzato — sicuro per crontab di produzione e pianificazioni interne con pattern temporali sensibili.
    Cos'è un'espressione cron?
    Un'espressione cron è una stringa a cinque campi che definisce una pianificazione ricorrente. I campi sono minuto (0-59), ora (0-23), giorno del mese (1-31), mese (1-12) e giorno della settimana (0-6, dove sia 0 sia 7 indicano domenica). Ogni campo accetta un valore, una lista (`1,3,5`), un intervallo (`1-5`), una wildcard (`*` = qualsiasi) o un passo (`*/15` = ogni 15). La combinazione di tutti e cinque i campi definisce esattamente quando il comando pianificato deve essere eseguito. Cron è nato in Unix V7 (1979) e resta il linguaggio di fatto per la pianificazione di job basati sul tempo su Linux/Unix, nell'orchestrazione di container (Kubernetes CronJobs), nella CI/CD (GitHub Actions, GitLab CI) e nelle piattaforme serverless (AWS EventBridge, Cloudflare Workers Cron Triggers). Nonostante le molte alternative proposte nei decenni, nessun sostituto ha rimpiazzato la grammatica scarna ed espressiva a cinque campi di cron.
    I miei dati vengono caricati da qualche parte?
    No. Tutto il parsing, la validazione e il calcolo delle prossime esecuzioni avvengono al 100% lato client nel tuo browser tramite JavaScript. Le tue espressioni non vengono mai trasmesse, mai salvate su alcun server, mai registrate e mai analizzate. Questo rende lo strumento sicuro per crontab di produzione, pattern di pianificazione interna che rivelano la temporizzazione dell'infrastruttura, e qualunque pianificazione sensibile. Puoi verificarlo nella scheda Network del tuo browser — digitare un'espressione cron non genera alcuna richiesta di rete. Lo strumento non usa cookie per i dati di input né analytics di terze parti che catturerebbero ciò che scrivi.
    Qual è la differenza tra cron POSIX e Quartz?
    Cron POSIX è lo standard a cinque campi usato da crontab Unix/Linux, timer systemd, GitHub Actions, GitLab CI, AWS EventBridge, Kubernetes CronJobs e dalla maggior parte degli scheduler. Quartz è una libreria di scheduling Java che aggiunge un campo secondi (sei o sette campi totali) più operatori extra: `?` (nessun valore specifico, usato quando giorno del mese e giorno della settimana entrano in conflitto), `L` (last — ultimo giorno del mese, ultimo venerdì, ecc.), `W` (giorno feriale più vicino) e `#` (n-esimo giorno della settimana del mese, es. `2#1` = primo martedì). Questo strumento implementa cron POSIX perché è di gran lunga più diffuso; gli operatori Quartz vengono segnalati come errori di sintassi con un chiaro messaggio "Operatori Quartz non supportati". Se ti serve Quartz, gli scheduler Java popolari come Quartz Scheduler e Spring `@Scheduled` sono il tuo target — ma le definizioni di pianificazione non sono portabili direttamente a cron Linux.
    Perché '0 0 1 * 5' viene eseguito ogni venerdì E il primo del mese?
    È la semantica OR di cron POSIX per giorno del mese / giorno della settimana, ed è la sorpresa più comune di cron. La regola: quando ENTRAMBI i campi sono ristretti (nessuno dei due è `*`), cron esegue il job se UNO O L'ALTRO corrisponde — non entrambi. Quindi `0 0 1 * 5` (giorno del mese=1, giorno della settimana=5) parte il primo di ogni mese E ogni venerdì, non solo i venerdì che cadono il primo. Se volessi solo quest'ultimo (semantica AND — venerdì-che-è-il-1°), non puoi esprimerlo nel cron standard; ti servirebbe uno script che parte ogni venerdì O il primo ed esce in anticipo in base alla data effettiva. Vixie cron (il default GNU/Linux), BSD cron e AWS EventBridge seguono tutti questa regola OR. L'anteprima delle prossime esecuzioni in questo strumento rende ovvia la pianificazione reale — incolla espressioni sospette e verifica prima del deploy.
    Come faccio a eseguire un job ogni 30 secondi?
    Non puoi, con il cron POSIX standard. La granularità minima di cron è un minuto — il campo più piccolo è il minuto (0-59). Per pianificazioni sub-minuto le tue opzioni sono: (1) Eseguire due job a `* * * * *` e `* * * * *` con `sleep 30 &&` davanti a uno — rozzo ma funziona con vixie cron. (2) Usare uno scheduler con supporto ai secondi come Quartz, Kubernetes CronJob con un controller personalizzato, o timer systemd con `OnCalendar: *-*-* *:*:00/30`. (3) Eseguire un daemon di lunga durata che dorme 30 secondi tra le iterazioni — la risposta giusta per la maggior parte delle esigenze di monitoraggio. (4) Passare a un trigger event-driven (webhook, coda di messaggi) se ti serve davvero una risposta in tempo reale. Il pattern cron a 30 secondi è quasi sempre il segno che cron è l'astrazione sbagliata.
    Che fuso orario usa cron?
    Su un server Linux, vixie cron usa il fuso orario di sistema — di solito impostato tramite `/etc/timezone` o la variabile d'ambiente `TZ`. È una fonte frequente di bug: un cron alle 9:00 su un server US East parte alle 14:00 UTC, ma su un server impostato su UTC parte alle 09:00 UTC (cioè le 4 del mattino East). La soluzione è impostare sempre i server su UTC e scrivere tutte le espressioni cron in UTC, oppure impostare la variabile `CRON_TZ=America/New_York` in cima al crontab per fissare il fuso orario esplicitamente (supportato da vixie cron 3.0+). Gli scheduler gestiti variano: GitHub Actions gira sempre in UTC, AWS EventBridge supporta il fuso orario nella definizione della pianificazione, Kubernetes CronJob ha aggiunto un campo `spec.timeZone` nella 1.27+. Il toggle UTC/Locale di questo strumento ti permette di vedere l'anteprima della pianificazione in entrambi i fusi orari — passa tra l'uno e l'altro per confermare che l'esecuzione avvenga dove intendi.
    In cosa si espande davvero '*/15'?
    L'operatore passo `*/N` significa "ogni N a partire dal valore valido più basso del campo". Per il minuto (intervallo 0-59), `*/15` si espande in `0,15,30,45` — quattro esecuzioni all'ora ai quarti d'ora. Il passo NON è "ogni 15 minuti a partire dall'ora corrente"; è ancorato al valore iniziale del campo. Stessa logica per gli altri campi: `*/2` nell'ora indica `0,2,4,...,22` (12 esecuzioni); `*/3` nel giorno del mese indica `1,4,7,...,31` (11 esecuzioni). Per basi del passo non-wildcard (es. `5/15`), l'espansione parte dalla base: `5/15` nel minuto = `5,20,35,50`. I valori di passo che non dividono uniformemente l'intervallo salteranno vicino al wraparound — è il comportamento corretto di cron, non un bug. L'anteprima delle prossime esecuzioni rende ovvia la pianificazione reale.
    Posso usare un'espressione a sei campi con i secondi?
    Le espressioni a sei campi con un campo secondi iniziale (intervallo 0-59) sono un'estensione di Quartz/Spring/Cron4j, non POSIX. Questo strumento accetta espressioni a sei campi quando l'input ha esattamente sei token separati da spazi — utile se il tuo target è Quartz, Spring `@Scheduled(cron=...)`, o librerie Node.js come `node-cron` che supportano i secondi. Per gli scheduler POSIX standard (crontab Linux, GitHub Actions, AWS EventBridge, Kubernetes CronJob), resta sui cinque campi — aggiungere un campo secondi iniziale romperà silenziosamente la pianificazione (lo scheduler interpreterà il tuo minuto come secondi, l'ora come minuto, ecc., spostando tutto di una posizione). Nel dubbio, controlla la documentazione del tuo scheduler target; se non dice esplicitamente "supportato a sei campi con secondi", usa cinque campi.
    Qual è l'intervallo massimo esprimibile in cron?
    Senza stato esterno, cron può esprimere in modo affidabile fino a una volta all'anno con `0 0 D M *` (es. `0 0 1 1 *` = ogni primo gennaio a mezzanotte). Per "ogni due anni" o intervalli più lunghi, cron da solo non basta — ti servirebbe un controllo di data esterno in cima allo script (es. `[ $(($(date +%Y) % 2)) -eq 0 ] && /tuo-comando` per eseguire negli anni pari). Per "ogni 90 giorni" o altri intervalli multi-giorno non allineati, cron fallisce anche: non c'è un operatore nativo di modulo-giorno, quindi scriveresti un wrapper che confronta il giorno dell'anno con una data di riferimento. Se le tue esigenze di pianificazione sono così complesse, valuta un vero workflow scheduler (Airflow, Temporal, AWS Step Functions) — la grammatica di cron è intenzionalmente semplice e cede su qualunque pattern oltre quelli settimanali/mensili regolari.
    Come gestisco le esecuzioni saltate dopo un downtime?
    Il cron standard non ha alcun recupero — se il sistema era spento all'orario pianificato, l'esecuzione viene semplicemente saltata. Non c'è un log che dica "abbiamo perso questa". Per i job critici hai tre opzioni: (1) Usare `anacron` (o `systemd-cron` con `Persistent=true`), che recupera i job persi dopo il boot, adatto a portatili e sistemi intermittenti. (2) Passare a uno scheduler con retry integrato: i CronJob Kubernetes hanno `startingDeadlineSeconds` (esegui se il ritardo rientra nel deadline) e `concurrencyPolicy` (evita esecuzioni sovrapposte); AWS EventBridge supporta retry policy. (3) Costruire l'idempotenza nel job stesso: invece di "genera il report alle 9", fai sì che il job chieda "il report di oggi è già stato generato?" e lo produca se no — così si auto-ripara dopo qualunque durata di downtime. L'opzione 3 è la più robusta e funziona con qualunque scheduler.
    Perché il mio cron di GitHub Actions non parte in orario?
    Le pianificazioni di GitHub Actions sono best-effort: possono partire con diversi minuti di ritardo sotto carico elevato sull'infrastruttura di GitHub, e durante carichi molto alti possono essere saltate del tutto (specialmente per intervalli brevi come ogni cinque minuti). Lo stesso vale per la maggior parte degli scheduler gestiti — barattano la precisione temporale per scala e affidabilità. Implicazioni pratiche: (1) Non pianificare cose che devono partire al secondo esatto; cron è per "all'incirca a quest'ora, quotidianamente". (2) Per intervalli brevi, preferisci un worker di lunga durata a un job pianificato. (3) Per cutoff finanziari o di conformità a orario esatto, usa un daemon cron dedicato su un server che controlli, o uno scheduler più stretto come AWS EventBridge Scheduler con Standard schedule. (4) Su GitHub Actions in particolare: evita intervalli inferiori a 15 minuti; lo scheduler li salterà spesso sotto carico.

    Strumenti correlati

    Vedi tutti gli strumenti →