Testador de expressão cron

Cole uma expressão cron e descubra, antes do deploy, o que ela faz de verdade: a explicação em português, os valores de cada campo e as próximas execuções no fuso que você escolher. Aceita o formato Unix de 5 campos e o de 6 campos com segundos, aponta o erro exato por campo e mostra o efeito do horário de verão. Tudo roda no seu navegador.

Ordem dos campos: minuto, hora, dia do mês, mês, dia da semana (no formato de 6 campos, o segundo vem antes). Aceita *, listas (1,15), intervalos (1-5), passos (*/15, 1-10/2), nomes (JAN-DEC, SUN-SAT) e macros como @daily.

Exemplos:

O cálculo roda no seu navegador; nada é enviado a servidores.

      Como usar

      1. Digite a expressão, por exemplo */15 9-18 * * 1-5, ou clique em um dos exemplos.
      2. Escolha o formato: 5 campos (crontab do Linux, GitHub Actions, Kubernetes CronJob) ou 6 campos, quando o primeiro campo é de segundos.
      3. Escolha o fuso. O padrão é o do seu navegador; UTC e a lista completa de fusos IANA ficam logo abaixo.
      4. Defina quantas execuções quer ver (5 a 50) e, para simular outra data, preencha A partir de.
      5. Clique em Calcular execuções ou pressione Enter. Copiar lista leva as datas, com o equivalente em UTC, para o seu caso de teste.

      Exemplos

      ExpressãoO que significa
      */15 9-18 * * 1-5A cada 15 minutos, das 9h às 18h45, de segunda a sexta
      0 9 * * MON-FRIÀs 9h, de segunda a sexta
      0 0 1 * *À meia-noite do dia 1 de cada mês (o mesmo que @monthly)
      30 4 1,15 * 5Às 4h30 nos dias 1 e 15 e também em toda sexta-feira
      */10 * * * * *A cada 10 segundos (formato de 6 campos)

      Como funciona

      No formato de 5 campos, a ordem é minuto (0–59), hora (0–23), dia do mês (1–31), mês (1–12 ou JAN–DEC) e dia da semana (0–7 ou SUN–SAT, com 0 e 7 valendo domingo). No formato de 6 campos, o segundo (0–59) vem antes de tudo. Cada campo aceita *, listas (1,15), intervalos (1-5) e passos (*/15, 1-10/2); 20/15 é lido como 20-59/15, como no GitHub Actions.

      As macros @yearly (ou @annually), @monthly, @weekly, @daily (ou @midnight) e @hourly são trocadas pela expressão equivalente. Já @reboot roda uma vez quando o serviço cron inicia (em geral, no boot). Como não depende de data nem hora, não há próximas execuções para calcular, e a ferramenta explica isso em vez de inventar datas.

      A regra do OU entre dia do mês e dia da semana

      Quando os dois campos de dia estão restritos (nenhum começa com *), o comando roda quando qualquer um deles bater, e não quando os dois baterem juntos. O manual do crontab dá o exemplo: 30 4 1,15 * 5 roda às 4h30 nos dias 1 e 15 de cada mês e também em toda sexta-feira. Para exigir as duas condições, filtre no próprio script. Se um dos campos começa com * (inclusive */2), ele não conta como restrito e os dois passam a valer juntos, como no cron Vixie/cronie.

      Fusos e horário de verão

      O cálculo segue o relógio do fuso escolhido, com as regras de fuso do navegador. Quando o relógio adianta, os horários inexistentes são pulados; quando atrasa, o horário repetido executa duas vezes, como descreve o manual do cronie. O fuso America/Sao_Paulo não tem horário de verão desde 2019; para ver o efeito, teste 0 0 * * * a partir de 02/11/2018: em 04/11/2018 a meia-noite não existiu, porque a mudança era à 0h.

      Quartz, Spring e GitHub Actions

      Cada sistema tem o seu dialeto de cron. Esta ferramenta implementa o cron Unix (5 campos) e a variante de 6 campos com segundos; quando encontra um recurso dos dialetos abaixo, diz qual é e de onde vem, sem tentar adivinhar.

      • Quartz (Java): 6 ou 7 campos, com os segundos primeiro e o ano opcional no fim. O dia da semana vai de 1 a 7 (domingo = 1, e não 0), e um dos campos de dia precisa ser ?. Há ainda L (último), W (dia útil mais próximo) e # (n-ésimo dia da semana do mês, como 6#3), não suportados aqui.
      • Spring (CronExpression, desde a versão 5.3): 6 campos com segundos primeiro e dia da semana de 0 a 7, igual ao cron. Aceita também ?, L, W e #; sem eles, a expressão funciona aqui no formato de 6 campos.
      • GitHub Actions: 5 campos POSIX, executados em UTC por padrão, com um campo timezone opcional. O intervalo mínimo é de 5 minutos, e a execução pode atrasar em horários de pico, como o início de cada hora. Macros como @daily não são aceitas, e, com fuso configurado, um horário pulado pelo horário de verão avança para o próximo horário válido (diferente do cronie). Para conferir um workflow, escolha UTC.

      Uso em QA e desenvolvimento

      • Revisar um job agendado no PR e anexar as próximas datas, no fuso do cliente e em UTC.
      • Montar casos de borda: virada de mês e de ano, 29 de fevereiro, madrugada da troca de horário.
      • Investigar “o job não rodou”: um fuso errado no servidor, a regra do OU ou um */35 costumam explicar.

      Erros comuns

      • Esquecer que o servidor está em UTC: 0 9 * * * no GitHub Actions sem timezone roda às 6h de Brasília.
      • Achar que */35 é “a cada 35 minutos”: o passo recomeça a cada hora, então o job roda nos minutos 0 e 35.
      • Colar uma expressão Quartz no crontab: o ? e o segundo campo extra quebram a linha. A mensagem de erro aponta o campo.
      • Usar intervalo invertido, como 22-2 para “das 22h às 2h”: o cron não dá a volta. Use 22-23,0-2.
      • Pedir dia 30 ou 31 em meses que não têm: 0 0 30 2 * nunca executa, e a ferramenta diz isso.

      Limitações

      • Não suporta ?, L, W, #, o campo de ano do Quartz nem o ~ (aleatório) do cronie.
      • O cálculo procura execuções nos próximos 100 anos e mostra até 50 por vez.
      • As regras de fuso são as do navegador; um navegador desatualizado pode não conhecer mudanças recentes.

      Perguntas frequentes

      Qual a diferença entre 0 e 7 no dia da semana?

      Nenhuma: os dois representam domingo no cron Unix e no Spring. No Quartz é diferente, porque lá domingo é 1 e sábado é 7.

      Por que meu job rodou duas vezes em um dia?

      Ou o horário caiu na hora repetida do fim do horário de verão, ou a expressão restringe os dois campos de dia e caiu na regra do OU.

      Minha expressão é enviada para algum servidor?

      Não. Tudo roda no JavaScript da página.

      Ferramentas relacionadas

      Referências