CodeKitHub
Herramientas de código

Generador de Expresiones Cron

Última actualización:

Una expresión cron es una cadena de cinco campos (minuto, hora, día del mes, mes, día de la semana) que le indica a un planificador como Unix cron, crontab o un pipeline de CI/CD exactamente cuándo ejecutar una tarea — por ejemplo, `*/15 9-17 * * MON-FRI` significa "cada 15 minutos, entre las 9am y las 5pm, de lunes a viernes". Esta herramienta funciona en ambos sentidos: crea un horario con menús desplegables sencillos y obtén la cadena cron, o pega una expresión cron existente y ve al instante una traducción en lenguaje sencillo más las próximas 5 veces que realmente se ejecutará. Sigue la sintaxis estándar de cron POSIX/Vixie de 5 campos usada por Unix, crontab de Linux y la mayoría de los planificadores de tareas — consulta la página del manual crontab(5) para la especificación canónica. Todo se ejecuta localmente en tu navegador; nada de lo que escribas se sube a ningún sitio.

Descripción
Próximas ejecuciones
    Constructor
    Minuto
    Hora
    Día del mes
    Mes
    Día de la semana
    Guía de sintaxis
    • * — any value
    • , — value list separator (e.g. 1,3,5)
    • - — range of values (e.g. 1-5)
    • / — step values (e.g. */15 = every 15)

    ¿Qué es esta herramienta?

    Una expresión cron es una cadena de horario compacta de cinco campos — `minuto hora día-del-mes mes día-de-la-semana` — usada por el demonio `cron` de Unix y prácticamente todos los planificadores de tareas basados en él (crontab, CronJobs de Kubernetes, `schedule:` de GitHub Actions, Airflow, Jenkins). Cada campo acepta un asterisco (`*`, que significa "cualquier valor"), un número específico, una lista separada por comas (`1,15,30`), un rango (`9-17`), un paso (`*/15`, que significa "cada 15 unidades") o, en el caso del mes y el día de la semana, un nombre de tres letras (`JAN`, `MON`) en lugar de un número.

    La definición canónica de esta sintaxis es la página del manual crontab(5) de Linux, que documenta exactamente los mismos cinco campos, caracteres especiales (`* , - /`) y las ocho cadenas abreviadas `@` (`@reboot`, `@yearly`/`@annually`, `@monthly`, `@weekly`, `@daily`/`@midnight`, `@hourly`) que la mayoría de las implementaciones de cron, incluida Vixie cron (la versión incluida en la mayoría de las distribuciones de Linux), admiten como alias para horarios comunes.

    Esta herramienta implementa exactamente ese formato estándar de 5 campos — el formato que escribirías directamente en `crontab -e` en un servidor Linux o macOS, o en el campo `schedule:` de un CronJob de Kubernetes. No implementa la sintaxis cron de Quartz, un formato diferente de 6 o 7 campos usado por el Quartz Scheduler de Java y por algunas herramientas de proveedores (consulta la sección de comparación más abajo para saber cuándo necesitas eso en su lugar).

    ¿Por qué utilizarlo?

    • Heredaste un repositorio y encuentras `0 3 * * 1-5` en un archivo de configuración de un CronJob de Kubernetes sin ningún comentario — pega la expresión aquí para confirmar en segundos que corre a las 3am de lunes a viernes antes de tocar nada.
    • Estás configurando un workflow de GitHub Actions con `schedule:` y no recuerdas si el orden de los campos es minuto-hora o hora-minuto — arma el horario con los menús desplegables en vez de arriesgarte a un error de desplazamiento de campos.
    • Un CronJob que debía correr solo los lunes empezó a ejecutarse también el día 1 de cada mes, y sospechas de la trampa clásica de día-del-mes y día-de-la-semana combinados — verifica las próximas 5 ejecuciones calculadas para confirmar el comportamiento de unión antes de reportar el bug.
    • Tu equipo de DevOps te pide una tarea que corra "cada 15 minutos en horario laboral, de lunes a viernes" y quieres entregar la expresión cron exacta en vez de una aproximación que alguien tenga que corregir después.
    • Ves `@daily` en un crontab heredado y no estás seguro si eso equivale a medianoche o a otro horario — traduce el atajo a su expresión de 5 campos equivalente antes de decidir si necesitas cambiarlo.
    • Estás migrando un job de Quartz Scheduler (con 6 o 7 campos) a un CronJob de Kubernetes estándar y necesitas confirmar que tu nueva expresión de 5 campos usa la sintaxis correcta, sin arrastrar caracteres como `?` o `L` que no existen en cron estándar.

    Cómo utilizarlo

    1. Para traducir una expresión: escribe o pega una cadena cron de 5 campos (o una abreviatura @ como `@daily`) en el campo de entrada.
    2. Lee la descripción en lenguaje sencillo y las próximas 5 ejecuciones calculadas debajo de ella — ambas se actualizan en tiempo real mientras escribes.
    3. Para crear una en su lugar: abre la sección Builder, elige un modo (cada / cada N / valor específico) para cada uno de los cinco campos, y haz clic en "Generar expresión".
    4. La expresión generada rellena el campo de entrada de arriba y se refleja de inmediato en los paneles de descripción y próximas ejecuciones.
    5. Usa la leyenda de sintaxis en la parte inferior como referencia rápida para `*`, `,`, `-` y `/`.
    6. Copia la expresión final con el botón de copiar y pégala en tu crontab, configuración de CI o planificador.

    Ejemplo

    Entrada

    */15 9-17 * * MON-FRI

    Resultado

    A las 09:00, 09:15, 09:30, 09:45, 10:00 ... 17:45, lunes, martes, miércoles, jueves, viernes

    Esta expresión se ejecuta cada 15 minutos, pero solo dentro del rango horario de 09:00 a 17:59, y solo en días laborables — un horario típico de consulta en "horario comercial".

    Cron estándar frente a cron Quartz

    La "sintaxis cron" no es un único estándar universal — los dos formatos con los que te encontrarás más a menudo difieren en el número de campos y en el significado de algunos caracteres especiales. Usa esta tabla para confirmar que estás usando el correcto para tu planificador de destino.

    AspectoCron estándar (esta herramienta)Cron Quartz
    Número de campos5 (minuto hora dom mes dow)6 o 7 (añade segundos y año opcional)
    Usado porcrontab de Linux/macOS, CronJob de Kubernetes, GitHub ActionsJava Quartz Scheduler, algunos planificadores empresariales
    Día del mes + día de la semana ambos definidosCoincide con CUALQUIERA de los dos (unión/O)Requiere `?` en uno de los dos campos — no se pueden definir ambos con un valor simultáneamente
    Caracteres especiales adicionalesNinguno más allá de `* , - /`Añade `?`, `L` (último), `W` (día laborable más cercano), `#` (n-ésimo día de la semana del mes)
    Programación a nivel de segundosNo compatibleCompatible (primer campo)

    Herramientas relacionadas

    ¿Trabajas con configuraciones, horarios o marcas de tiempo? Estas herramientas combinan bien con el generador cron.

    Conversor de Marcas de Tiempo · Conversor de Reloj Mundial · Calculadora de Fechas

    Horarios cron comunes y su significado

    Estos son algunos de los patrones que más se repiten en configuraciones reales de CI/CD, backups y tareas de mantenimiento — útiles como punto de partida antes de ajustar los campos a tu caso.

    • `0 0 * * *` — todos los días a medianoche, el horario clásico para backups nocturnos o limpieza de logs.
    • `0 9 * * 1-5` — a las 9am, de lunes a viernes, típico para reportes automáticos que solo interesan en días laborables.
    • `*/5 * * * *` — cada 5 minutos, común en healthchecks o sincronización frecuente de datos.
    • `0 0 1 * *` — el día 1 de cada mes a medianoche, usado para facturación mensual o rotación de reportes.
    • `0 2 * * 0` — cada domingo a las 2am, un horario habitual para tareas pesadas de mantenimiento cuando el tráfico es bajo.

    Preguntas frecuentes

    ¿Qué es una expresión cron?

    Una expresión cron es una cadena de texto de 5 campos (`minuto hora día-del-mes mes día-de-la-semana`) que especifica un horario recurrente para el demonio `cron` de Unix y planificadores compatibles. Cada campo puede ser `*` (cualquier valor), un número, una lista separada por comas, un rango (`a-b`) o un paso (`*/n`); los campos de mes y día de la semana también aceptan nombres de tres letras como `JAN` o `MON`. La especificación completa está documentada en la página del manual crontab(5).

    ¿Qué ocurre cuando se restringen tanto el día del mes como el día de la semana?

    Esta es una trampa bien conocida de cron: según la semántica de cron POSIX, cuando AMBOS campos, día-del-mes y día-de-la-semana, están restringidos (no son `*`), una tarea se ejecuta si se cumple CUALQUIERA de las dos condiciones — es una unión (O), no una intersección (Y). Por ejemplo, `0 4 8 * MON` se ejecuta a las 4am tanto el día 8 de cada mes COMO cada lunes, no solo los lunes que caen en el día 8. Esta herramienta implementa exactamente ese comportamiento de unión al calcular las próximas ejecuciones.

    Cron estándar frente a cron Quartz — ¿cuál necesito?

    Esta herramienta genera la sintaxis cron estándar POSIX/Vixie de 5 campos — el formato usado por `crontab` de Linux/macOS, los CronJobs de Kubernetes, el `schedule:` de GitHub Actions y la mayoría de los ejecutores de tareas derivados de Unix. El cron Quartz, usado por el Quartz Scheduler de Java y por herramientas construidas sobre él (algunos planificadores empresariales, configuraciones antiguas de Spring Batch), es un formato diferente de 6 o 7 campos que añade un campo de segundos al principio e intercambia el significado de algunos caracteres especiales (`?` para "sin valor específico" en los campos de día, `L`/`W`/`#` para "último día", "día laborable más cercano" y "n-ésimo día de la semana del mes"). Si tu planificador usa 6 o 7 campos, o tu documentación menciona `?`, `L`, `W` o `#`, necesitas una herramienta específica para Quartz — las expresiones de este generador no se analizarán correctamente allí. Si son exactamente 5 campos (o una abreviatura tipo `@daily`), estás en el lugar correcto.

    ¿Qué significan los atajos @yearly, @monthly, @weekly, @daily y @hourly?

    Son cadenas abreviadas no estándar pero ampliamente compatibles que se expanden a expresiones comunes de 5 campos: `@yearly`/`@annually` = `0 0 1 1 *` (una vez al año, el 1 de enero a medianoche), `@monthly` = `0 0 1 * *` (el día 1 de cada mes a medianoche), `@weekly` = `0 0 * * 0` (cada domingo a medianoche), `@daily`/`@midnight` = `0 0 * * *` (todos los días a medianoche), `@hourly` = `0 * * * *` (en punto de cada hora). Esta herramienta las analiza todas y las trata exactamente como su equivalente expandido de 5 campos.

    ¿Puedo usar nombres de días/meses en lugar de números?

    Sí. El campo de mes acepta nombres de tres letras de `JAN` a `DEC`, y el campo de día de la semana acepta `SUN` a `SAT` (sin distinguir mayúsculas y minúsculas), de forma intercambiable con los números. Los números de día de la semana van de 0 a 6, siendo 0 = domingo; algunas implementaciones también aceptan 7 para el domingo, lo cual esta herramienta normaliza a 0. Los rangos y las listas también funcionan con nombres, por ejemplo `MON-FRI` o `JAN,JUN,DEC`.

    ¿Se envía mi expresión cron a un servidor?

    No. El análisis, la descripción en lenguaje sencillo y el cálculo de las próximas ejecuciones ocurren todos localmente en JavaScript dentro de tu navegador. Nada de lo que escribas o generes sale jamás de tu dispositivo.

    ¿En qué zona horaria calcula la herramienta las próximas ejecuciones?

    Usa la zona horaria configurada en tu navegador/dispositivo. Ten en cuenta que muchos sistemas cron en servidores están configurados en UTC por defecto, así que si tu servidor no está en tu misma zona horaria, las próximas ejecuciones que veas aquí pueden diferir de las horas reales de ejecución en el servidor — verifica la zona horaria del sistema antes de confiar en el resultado.

    ¿Cómo escribo una expresión que corra el último día de cada mes?

    El cron estándar de 5 campos no tiene un carácter especial para "último día del mes" (eso es `L`, exclusivo de Quartz) — la solución habitual es programar la tarea para el día 1 del mes siguiente y restar un día en el script, o usar `28-31` combinado con lógica adicional en el propio job para verificar si es el último día.

    ¿Por qué mi expresión con `*/7` en el campo de día del mes no se ejecuta cada 7 días exactamente?

    El paso `*/7` en el campo de día del mes no cuenta desde la última ejecución, sino desde el día 1 del mes: se ejecuta los días 1, 8, 15, 22 y 29 — no cada 7 días de forma continua entre meses. Para un intervalo real de 7 días sin reinicio mensual, necesitas lógica externa al cron o un planificador con soporte de intervalos relativos.

    ¿Puedo generar un horario que se ejecute varias veces con minutos específicos, como en el minuto 0, 15, 30 y 45?

    Sí — usa una lista separada por comas en el campo de minutos: `0,15,30,45 * * * *`. Es equivalente en resultado a `*/15 * * * *` para este caso específico, pero una lista te da control total cuando los minutos no están espaciados uniformemente.

    Herramientas relacionadas