Cron explicado: os 5 campos, exemplos e armadilhas comuns
Uma expressão cron parece código cifrado, mas segue uma regra curta: cinco campos, cada um com poucas opções. Veja como ler, como montar os casos do dia a dia e onde as pessoas mais erram.
Os 5 campos
O cron padrão, descrito na página crontab(5), tem cinco campos separados por espaço, sempre nesta ordem:
minuto hora dia-do-mês mês dia-da-semana 0-59 0-23 1-31 1-12 0-7
No dia da semana, tanto 0 quanto 7 significam domingo. Nos campos de mês e dia da semana também valem os nomes com três letras (jan, mon), sem diferenciar maiúsculas de minúsculas. Os outros campos aceitam só números.
Lido da esquerda para a direita, 0 8 * * 1-5 significa: minuto 0, hora 8, qualquer dia do mês, qualquer mês, de segunda (1) a sexta (5). Ou seja, às 08:00 nos dias úteis.
Os quatro operadores
- Asterisco (
*): qualquer valor do campo. - Lista (
,): vários valores.1,15no dia do mês é dia 1 e dia 15. - Intervalo (
-): inclusivo nas duas pontas.8-11na hora é 8, 9, 10 e 11. O primeiro número não pode ser maior que o segundo. - Passo (
/): pula valores depois de um intervalo ou de um asterisco.*/15no minuto é 0, 15, 30 e 45.0-23/2na hora é uma hora sim, outra não.
Detalhe que pega muita gente: o passo vale só dentro do próprio campo. Segundo o manual, */23 no campo da hora roda nas horas 0 e 23, e não "a cada 23 horas corridas". Do mesmo modo, 0 */7 * * * não é "a cada 7 horas". Rodando no verificador do Me Ajuda Flow, a partir de sexta, 06/11/2026, às 12:00, os próximos horários são 14:00 e 21:00 de sexta, e depois 00:00, 07:00 e 14:00 de sábado: o intervalo entre 21:00 e 00:00 é de 3 horas, porque o contador reinicia a cada dia.
A regra do OU entre dia do mês e dia da semana
Esta é a armadilha mais famosa. Quando os dois campos de dia estão restritos (nenhum deles começa com *), o cron não exige os dois: ele roda quando um ou o outro bater. O exemplo do próprio manual é 30 4 1,15 * 5, que roda às 04:30 nos dias 1 e 15 de cada mês e também em todas as sextas.
Na ferramenta, partindo de 06/11/2026, essa expressão devolveu: sex 13/11, dom 15/11, sex 20/11, sex 27/11 e ter 01/12, sempre às 04:30. Repare no dia 15, que caiu num domingo, e nas sextas que não são dia 1 nem 15. Quem queria "a sexta que cair no dia 1 ou 15" não terá o que esperava. Para o mesmo horário só nos dias 1 e 15, o dia da semana deve ficar com *: 30 4 1,15 * * devolveu 15/11, 01/12, 15/12, 01/01 e 15/01.
Se você precisa mesmo do E (por exemplo, "só quando o dia 1 for segunda"), o cron puro não resolve. A saída é agendar de forma mais ampla e checar a condição dentro do fluxo ou do script.
Exemplos úteis, com próximos horários reais
Todos os horários abaixo foram calculados pela ferramenta de cron, a partir de sexta, 06/11/2026, 12:00, no horário de Brasília.
Todo dia útil às 08:00: 0 8 * * 1-5
Próximas execuções: seg 09/11, ter 10/11, qua 11/11, qui 12/11 e sex 13/11, todas às 08:00. Observe que "dia útil" aqui significa apenas segunda a sexta: feriados não são conhecidos pelo cron. Para pular feriados, o fluxo precisa conferir uma lista, como na ferramenta de dias úteis, que considera feriados nacionais.
A cada 15 minutos: */15 * * * *
Próximas: 12:15, 12:30, 12:45, 13:00 e 13:15. No GitHub Actions, a documentação informa que o intervalo mínimo de um agendamento é de 5 minutos e que execuções podem atrasar em horários de alta carga, principalmente no início de cada hora. Por isso, evite marcar tudo em 0.
Segundas e quartas às 09:00: 0 9 * * 1,3
Próximas: seg 09/11, qua 11/11, seg 16/11, qua 18/11 e seg 23/11.
Dia 31: 0 0 31 * *
O cron não corrige meses curtos: a expressão só roda em meses com dia 31. Partindo da mesma data, os próximos são 31/12/2026, 31/01/2027, 31/03/2027, 31/05/2027 e 31/07/2027. Fevereiro, abril, junho, setembro e novembro ficam de fora, e é aqui que muita gente perde uma rotina de fechamento.
Último dia do mês quando o cron não suporta
O cron de 5 campos não tem "último dia". Uma alternativa comum é agendar nos dias 28 a 31 (0 9 28-31 * *) e deixar o fluxo decidir se hoje é mesmo o último. Com essa expressão, novembro de 2026 devolve 28/11, 29/11 e 30/11 às 09:00, e depois 28/12 e 29/12. Só uma dessas execuções por mês deve seguir adiante. Em Power Automate, a condição pode ser:
equals(dayOfMonth(addDays(utcNow(), 1)), 1)
Ela é verdadeira quando amanhã é dia 1. Atenção ao fuso: perto da meia-noite, o "amanhã" em UTC pode não coincidir com o seu. Se o fluxo roda de manhã, a diferença normalmente não aparece, mas vale testar com a data real.
Esta expressão foi validada pelo verificador do site, mas não afirmo aqui uma execução em um fluxo real: teste no seu ambiente antes de confiar.
Em outros agendadores existe suporte direto. A documentação do Azure Logic Apps mostra, para o gatilho Recurrence com frequência mensal, o valor "monthDays": [-1] no código do fluxo, para rodar uma vez no último dia do mês. A página é do Logic Apps; para o Power Automate, confirme na visualização de código do seu fluxo se o gatilho aceita esse formato antes de depender dele.
Quartz: 6 ou 7 campos e o ponto de interrogação
O Quartz, muito usado em Java e em ferramentas baseadas nele, usa um formato diferente. Segundo a documentação, a expressão tem 6 ou 7 campos: segundos, minutos, horas, dia do mês, mês, dia da semana e, opcionalmente, ano. Além disso, existem símbolos que o cron padrão não entende:
?significa "sem valor específico" e deve ser usado em um dos dois campos de dia. A documentação diz que o suporte a ter os dois preenchidos é incompleto: é preciso usar?em um deles.Lé o último dia do mês (ou o último da semana, conforme o campo).L-3conta três dias para trás.Wescolhe o dia útil mais próximo de uma data, sem atravessar o mês.#escolhe a enésima ocorrência de um dia da semana:6#3é a terceira sexta, segundo a documentação.
Ou seja, o "todo dia útil às 08:00" no Quartz seria algo como 0 0 8 ? * MON-FRI; confira os nomes e a numeração dos dias na documentação do Quartz. Se você colar essa forma no verificador de cron de 5 campos do Me Ajuda Flow, ele recusa e avisa que ? é sintaxe do Quartz. O sinal é útil: um cron com 6 campos ou com ?, L, W ou # não é cron padrão. Também o contrário vale: o L não existe no manual do crontab.
Fuso horário e horário de verão
O cron não carrega fuso: ele roda no fuso do serviço que o executa. No GitHub Actions, a documentação diz que os agendamentos rodam em UTC por padrão, com a opção de informar um fuso IANA pela chave timezone. Um 0 8 * * 1-5 escrito esperando 08:00 de Brasília seria executado às 08:00 UTC, que é 05:00 em Brasília (UTC-3).
Em fusos com horário de verão, o manual do crontab avisa que horários "pulados" nunca batem, e os jobs marcados nessa janela deixam de rodar; horários repetidos podem rodar duas vezes. O GitHub informa um comportamento diferente: horários em hora pulada passam para o próximo horário válido. Cada agendador decide, então confira o do seu.
No Power Automate, o gatilho Recurrence não usa cron: você escolhe frequência, intervalo, Time zone e, para frequência de dia ou semana, as horas e os minutos. O Microsoft Learn mostra o formato do início como AAAA-MM-DDTHH:MM:SSZ, com a letra Z indicando UTC. A documentação do Logic Apps recomenda selecionar um fuso horário para que o gatilho respeite o horário de verão; sem fuso, o horário pode deslocar uma hora quando o horário de verão começa ou termina. Para conferir a diferença entre dois fusos em uma data, use a ferramenta de fuso horário.
O "todo dia útil às 08:00" no Recurrence fica assim: frequência Week, dias de segunda a sexta, hora 8, minuto 0 e o fuso correto. Segundo a documentação do Logic Apps, se você não informar os minutos, eles são calculados a partir de quando a recorrência começa, então preencha o campo de minutos.
Checklist antes de publicar um agendamento
- Conte os campos: 5 é cron padrão; 6 ou 7 é Quartz.
- Se usar dia do mês e dia da semana ao mesmo tempo, lembre-se do OU.
- Confirme o fuso em que o serviço interpreta o horário.
- Rode a expressão na ferramenta de cron e confira os próximos cinco horários com os olhos, não só a sintaxe.
- Se a regra pedir "último dia", "dia útil de verdade" ou "terceira sexta", planeje a verificação dentro do fluxo.
Para montar e testar sua expressão, use a ferramenta de cron do Me Ajuda Flow: ela explica cada campo em português e mostra os próximos horários de execução.