Skip to content

Generador Crontab y Constructor de Expresiones Cron

Construye, valida y decodifica expresiones cron en el navegador. Vista previa de próximas ejecuciones en hora local o UTC. POSIX 5 campos, presets y descripción natural. Gratis y privado.

Sin rastreo Se ejecuta en el navegador Gratis
Todo el análisis y el cálculo de próxima ejecución sucede localmente en tu navegador. No se envía ningún dato a ningún servidor.

Campos
Presets

Lenguaje natural

Próximas 5 ejecuciones programadas

Zona horaria para la vista previa
    Revisado por cumplimiento POSIX de 5 campos, corrección de semántica OR, anclaje del operador de paso, expansión de tokens con nombre y rechazo de operadores de Quartz con errores útiles — Equipo de Ingeniería de Go Tools · May 20, 2026

    ¿Qué Es una Expresión Cron?

    Una expresión cron es una cadena de cinco campos que define una programación recurrente. De izquierda a derecha, los campos son minuto (0-59), hora (0-23), día del mes (1-31), mes (1-12) y día de la semana (0-6, donde 0 y 7 significan domingo). Cada campo acepta un valor, una lista (`1,3,5`), un rango (`1-5`), un comodín (`*` significando cualquier valor) o un paso (`*/15` significando cada 15). La combinación define exactamente cuándo se ejecutará el comando programado; por ejemplo, `0 9 * * 1-5` se lee como "en el minuto 0, hora 9, cualquier día del mes, cualquier mes, día de la semana de lunes a viernes", en lenguaje natural, "días laborables a las 9:00 AM".

    Cron se originó en Unix Versión 7 en 1979 y la gramática de cinco campos ha permanecido prácticamente sin cambios durante más de cuatro décadas, un testimonio de lo bien diseñada que está la sintaxis original. Hoy las expresiones cron se usan mucho más allá del archivo crontab de Unix: CronJobs de Kubernetes, workflows de GitHub Actions, reglas de AWS EventBridge, pipelines programadas de GitLab CI, Cron Triggers de Cloudflare Workers y plataformas serverless en cada nube aceptan la misma gramática de cinco campos. Aprender cron una vez significa saber programar trabajos en cualquier contexto moderno de infraestructura.

    El estándar POSIX define cinco operadores: `*` (cualquier valor), `,` (lista de valores), `-` (rango), `/` (paso) y tokens con nombre para meses (JAN-DEC) y días de la semana (SUN-SAT). La mayoría de implementaciones también expanden cinco atajos comunes: `@yearly` (`0 0 1 1 *`), `@monthly` (`0 0 1 * *`), `@weekly` (`0 0 * * 0`), `@daily` (`0 0 * * *`) y `@hourly` (`0 * * * *`). El scheduler Quartz (una librería Java) extiende esto con un campo opcional de segundos y operadores adicionales (`?`, `L`, `W`, `#`), útil si trabajas en Java/Spring, pero no portable a cron estándar. Esta herramienta sigue el estándar POSIX de cinco campos porque es la variante dominante y la que tu servidor Linux, runner de GitHub Actions y cluster de Kubernetes realmente entenderán.

    Una peculiaridad de cron POSIX merece atención especial: cuando tanto día del mes como día de la semana están restringidos (ninguno es `*`), la programación se ejecuta cuando CUALQUIERA coincide, semántica OR, no AND. Así que `0 0 1 * 5` se ejecuta el día 1 de cada mes Y todos los viernes, no solo los viernes que caen en día 1. Es la sorpresa más común de cron; la vista previa de próxima ejecución en esta herramienta lo deja claro mostrando las fechas y horas reales en que la programación se disparará. Verifica antes de desplegar.

    Todo el análisis y el cálculo de próxima ejecución sucede enteramente en tu navegador usando JavaScript: ninguna expresión, programación u otro dato se envía nunca a un servidor. Esta herramienta analiza cualquier expresión cron POSIX estándar al instante con descripción en lenguaje natural y vista previa de cinco ejecuciones, con privacidad completa.

    Las expresiones cron están estrechamente relacionadas con otras herramientas para desarrolladores. Los trabajos cron se depuran comúnmente comparando timestamps Unix contra los tiempos de ejecución esperados, y las programaciones complejas a menudo se documentan como configuración JSON que puede validarse con nuestro formateador JSON. Para una guía a fondo que cubre la semántica OR, las trampas de zona horaria y las variantes comunes de cron con ejemplos en Linux, Kubernetes y GitHub Actions, lee nuestra referencia de programaciones 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)

    Características Clave

    Parser POSIX de 5 Campos en Vivo

    Parser estricto que sigue cron POSIX: minuto (0-59), hora (0-23), día del mes (1-31), mes (1-12 o JAN-DEC), día de la semana (0-6 o SUN-SAT, con 7 también aceptando domingo). Todos los operadores estándar (`*` `,` `-` `/`) y macros (`@yearly` `@monthly` `@weekly` `@daily` `@hourly`) soportados.

    Vista Previa de las Próximas 5 Ejecuciones

    Calcula las próximas cinco horas de ejecución programada desde tu hora local actual. Cambia entre Local y UTC con un clic, la forma más fiable de detectar sorpresas de zona horaria antes de desplegar un crontab a un servidor en una región distinta.

    Descripción en Lenguaje Natural

    Cada expresión válida obtiene una explicación legible: "Cada 15 minutos", "Días laborables a las 9:00 AM", "A las 02:30 el día 1 del mes, en enero y julio". Hace que la revisión de código y el traspaso al equipo sean sencillos, sin adivinar qué hace realmente `*/5 9-17 * * 1-5`.

    Mensajes de Error a Nivel de Campo

    Las expresiones inválidas obtienen feedback rojo instantáneo con el campo problemático resaltado y un error específico: "Error en minuto: valor fuera de rango [0, 59]: "60"". Se acabaron los fallos silenciosos de crontab descubiertos tres días después cuando el reporte no se ejecutó.

    Chips de Preset para Programaciones Comunes

    Once presets de un clic cubren las programaciones que realmente usarás: cada minuto, cada 5/15 minutos, cada hora, diariamente a medianoche o a las 9 AM, días laborables a las 9 AM, semanalmente el domingo/lunes, primero de cada mes y anualmente. Toca, ajusta, despliega.

    Inputs Constructores por Campo

    No memorices el orden de los cinco campos: cinco inputs pequeños etiquetados Minuto, Hora, Día del mes, Mes y Día de la semana te permiten editar una posición a la vez sin perder un valor ni mezclar el orden. La expresión completa de arriba se reconstruye automáticamente.

    Semántica POSIX OR Bien Implementada

    Cuando tanto día del mes como día de la semana están restringidos, entra en acción la regla OR: `0 0 1 * 5` se ejecuta cada día 1 Y cada viernes. La vista previa de próxima ejecución hace esto visible antes de desplegar; no más alertas sorpresa en fin de semana.

    Privacidad 100% en el Navegador

    Tus expresiones cron, que a menudo revelan tiempos de infraestructura y patrones internos de scheduling, nunca salen de tu navegador. No se envía ningún dato a ningún servidor, sin logging, sin analítica. Puedes verificarlo en la pestaña de Red de tu navegador. Seguro para programaciones de producción y sistemas internos.

    Mensajes de Error Conscientes de Quartz

    Si pegas una expresión Quartz con `?` `L` `W` o `#`, el parser explica "Operadores de Quartz no soportados, usa sintaxis POSIX", así sabes que debes reescribirla para cron en lugar de depurar un fallo silencioso. Las programaciones Quartz no corren en cron de Linux.

    Variantes de Cron y Schedulers

    Vixie cron (default de Linux)

    5 campos POSIX

    El default en la mayoría de distros Linux. POSIX estricto con la extensión `CRON_TZ=` para zona horaria explícita. Aplica la semántica OR de día del mes / día de la semana. Objetivo principal de esta herramienta.

    BSD cron

    5 campos POSIX

    Default en macOS y familia BSD. Compatible con POSIX con diferencias menores de implementación frente a vixie cron; la mayoría de expresiones funcionan idénticamente.

    timers de systemd (OnCalendar)

    spec de calendario, no cron

    Alternativa a cron en Linux basado en systemd. Usa sintaxis `OnCalendar: 2026-*-* 09:00:00`, más legible para programaciones no recurrentes pero no interoperable con expresiones cron.

    Quartz Scheduler (Java/Spring)

    6 o 7 campos

    Añade campos de segundos (obligatorio) y año (opcional), más operadores `?`, `L`, `W`, `#`. Útil para apps Java pero no portable a cron de Linux.

    AWS EventBridge

    6 campos estilo Quartz con `?`

    Requiere que día de la semana o día del mes sea `?` (convención Quartz) en lugar de `*` cuando solo uno está restringido. Las expresiones no se portan directamente a cron de Linux.

    CronJob de Kubernetes

    5 campos POSIX + campo timeZone

    Programación POSIX de 5 campos más campo `spec.timeZone` (1.27+). Más limpio que depender de la zona horaria del host del kubelet. Las expresiones se portan directamente desde cron de Linux.

    GitHub Actions

    5 campos POSIX

    Siempre corre en UTC. Tiempo best-effort, puede omitirse bajo alta carga. Evita intervalos menores a 15 minutos. Las expresiones se portan directamente desde cron de Linux.

    Ejemplos de Expresiones Cron

    Cada 15 Minutos

    */15 * * * *

    Operador de paso: `*/15` en el campo minuto significa "cada 15 minutos empezando en el minuto 0", por lo que las ejecuciones ocurren a :00, :15, :30, :45 de cada hora de cada día. Es el intervalo más común para hacer polling de APIs, refrescar cachés y chequeos de heartbeat.

    Días Laborables a las 9:00 AM

    0 9 * * 1-5

    El rango `1-5` en el campo día de la semana significa de lunes a viernes (1=lun, 5=vie). Se ejecuta exactamente a las 09:00, útil para reportes en horario laboral, trabajos por lotes que dependen de datos generados durante la noche y recordatorios diarios de standup.

    Primero del Mes a Medianoche

    0 0 1 * *

    Día del mes `1`, todos los demás campos inferiores en cero. Común para facturación mensual, rotación de logs y conciliación de fin de período. Día del mes y día de la semana están ambos restringidos solo cuando ninguno es `*`; aquí día de la semana es `*`, así que solo importa el día del mes.

    Cada 5 Minutos Entre 9 AM y 5 PM, Días Laborables

    */5 9-17 * * 1-5

    Combina paso (`*/5`) con rango (`9-17`) en campos distintos. Útil para monitoreo solo en horario laboral o drenaje de colas. Total: 12 ejecuciones/hora × 9 horas × 5 días = 540 ejecuciones por semana laboral.

    Trimestral: Día 1 de Ene, Abr, Jul, Oct a Medianoche

    0 0 1 JAN,APR,JUL,OCT *

    Meses con nombre en una lista separada por comas. Programaciones trimestrales como cierre financiero, revisiones de code-freeze o auditorías de cumplimiento. Puedes mezclar nombres y números (`1,APR,7,10` se interpreta igual), pero mantente en un solo estilo por legibilidad.

    Trampa POSIX OR: Día 1 del Mes O Cada Viernes

    0 0 1 * 5

    Cuando AMBOS día del mes (`1`) Y día de la semana (`5`) están restringidos, cron POSIX ejecuta el trabajo si CUALQUIERA coincide. Así que esto se dispara el día 1 de cada mes Y todos los viernes, no solo los viernes que caen en día 1. Es la sorpresa más común de cron; la vista previa de próxima ejecución lo deja claro.

    Cada Día a las 02:30 (Ventana de Bajo Tráfico)

    30 2 * * *

    Valores específicos tanto para hora como para minuto, comodines en el resto. La ventana 02:00-04:00 UTC es la convención de facto para trabajos por lotes nocturnos porque no se superpone con el horario laboral de ninguna región de negocio importante. Combínalo con el toggle UTC para confirmar que la ejecución cae donde esperas.

    Equivalente Macro: @daily

    @daily

    El atajo `@daily` (también `@midnight`) se expande a `0 0 * * *`, todos los días a medianoche. Otros macros: `@yearly` = `0 0 1 1 *`, `@monthly` = `0 0 1 * *`, `@weekly` = `0 0 * * 0`, `@hourly` = `0 * * * *`. Los macros son concisos, pero la forma de cinco campos es más portable entre schedulers (algunos soportan macros, otros no).

    Cómo Construir una Expresión Cron

    1. 1

      Escribe o pega una expresión cron

      Introduce una expresión cron de cinco campos en el input de arriba (p. ej. `*/15 * * * *`). La herramienta analiza y valida mientras escribes: check verde para válida, error rojo con nombre de campo para inválida. Macros como `@daily`, `@hourly`, etc. también se aceptan.

    2. 2

      O ajusta los cinco inputs de campo

      No memorices el orden de los campos: edita Minuto, Hora, Día del mes, Mes o Día de la semana individualmente usando los inputs etiquetados. La expresión completa de arriba se actualiza automáticamente. Usa `*` para comodines, `*/N` para pasos, `a-b` para rangos y `1,3,5` para listas.

    3. 3

      Elige un preset para empezar rápido

      Toca cualquier chip preset (Cada 15 minutos, Días laborables a las 9 AM, etc.) para cargar una programación común, y luego ajusta los campos según tu necesidad exacta. Once presets cubren los patrones que realmente usarás en producción.

    4. 4

      Verifica la vista previa de próxima ejecución

      Mira las cinco próximas fechas y horas de ejecución; cambia entre Local y UTC para confirmar que la programación se dispara cuando pretendes. Es la forma más fiable de detectar la trampa OR día del mes / día de la semana de POSIX antes de que te muerda en producción.

    5. 5

      Copia y pega en tu scheduler

      Haz clic en Copiar para tomar la expresión. Pégala en tu crontab, timer de systemd, `cron:` de GitHub Actions, AWS EventBridge, `schedule` de CronJob de Kubernetes o cualquier scheduler compatible con cron. No olvides verificar la zona horaria del scheduler objetivo; mira la sección de Buenas Prácticas más abajo.

    Errores Comunes en Cron

    Trampa POSIX OR: Ambos Campos de Día Restringidos

    Cuando AMBOS día del mes y día de la semana están restringidos, cron POSIX ejecuta el trabajo si CUALQUIERA coincide, no ambos. Así que `0 0 1 * 5` se dispara el día 1 de cada mes Y todos los viernes, no solo los viernes que caen en día 1. Usa `*` en uno de los dos campos de día cuando quieras una condición única, o escribe un script wrapper que haga el chequeo AND.

    ✗ Incorrecto
    # Pretendido: "primer viernes del mes"
    0 0 1-7 * 5
    # Realmente: se dispara los días 1-7 del mes O cada viernes, ambas condiciones
    ✓ Correcto
    # Usa wrapper para semántica AND verdadera
    0 0 * * 5  [ $(date +\%d) -le 7 ] && /tu-script
    # O elimina una condición y acepta la programación más laxa

    Drift de Zona Horaria Entre Dev y Prod

    Las programaciones cron en un servidor Linux usan la zona horaria del sistema, no la zona horaria local del autor. Un cron de 9:00 AM en un servidor configurado en UTC se dispara a las 4:00 AM US East. Diseña siempre programaciones contra la zona horaria del servidor objetivo, preferiblemente UTC, y fija la zona horaria explícitamente con `CRON_TZ=...` al inicio del crontab.

    ✗ Incorrecto
    # Escrito por dev de US East, desplegado a servidor UTC
    0 9 * * *  /tu-reporte.sh
    # Se dispara a las 9 AM UTC = 4 AM US East, no lo que el dev quería
    ✓ Correcto
    # Fija zona horaria, o escribe en UTC explícitamente
    CRON_TZ=America/New_York
    0 9 * * *  /tu-reporte.sh

    Confusión del Operador de Paso: '*/15' vs '15'

    `*/15` en minuto significa "cada 15 minutos empezando en 0" (entonces 0, 15, 30, 45). Solo `15` significa "solo en el minuto 15", una ejecución por hora. Los principiantes frecuentemente escriben `15` pensando que es cada 15 minutos; la descripción en lenguaje natural de la herramienta hace el error obvio antes de desplegar.

    ✗ Incorrecto
    # Pretendido: cada 15 minutos
    15 * * * *
    # Realmente: una vez por hora, en el minuto 15 (4 ejecuciones/hora menos de lo pretendido)
    ✓ Correcto
    # Correcto
    */15 * * * *
    # Cada 15 minutos: minuto 0, 15, 30, 45 de cada hora

    Expresión de Seis Campos en Scheduler POSIX

    Quartz/Spring/node-cron soportan un campo opcional de segundos como primera posición. Crontab de Linux, GitHub Actions, AWS EventBridge (en su mayoría) y CronJob de Kubernetes NO: esperan cinco campos. Pegar una expresión de seis campos rompe silenciosamente la programación: tus segundos se vuelven minutos, los minutos se vuelven horas, etc.

    ✗ Incorrecto
    # Quartz de 6 campos copiado a crontab de Linux
    0 0 9 * * 1-5
    # Linux lee: minuto=0, hora=0, dom=9, mes=*, dow=1-5
    # = medianoche en días 9 en meses coincidentes con días laborables — caos
    ✓ Correcto
    # POSIX 5 campos, elimina los segundos
    0 9 * * 1-5
    # = días laborables a las 9:00 AM

    Día del Mes Fuera de Rango para el Mes

    Cron no valida el día del mes contra el mes real. `0 0 31 2 *` (31 de febrero) se analiza bien pero nunca coincide: febrero tiene como máximo 29 días. Los principiantes asumen que el parser detectará esto; no lo hace. La vista previa de próxima ejecución en esta herramienta muestra "No hay ejecuciones próximas" cuando una expresión es estructuralmente válida pero lógicamente imposible.

    ✗ Incorrecto
    # Febrero 30 o 31, nunca se ejecuta
    0 0 30 2 *
    0 0 31 2 *
    # Se analiza pero ninguna programación se dispara nunca
    ✓ Correcto
    # Usa patrón 'último día laborable de febrero' vía script
    0 0 28-29 2 *  [ $(date -d tomorrow +\%m) = 03 ] && /tu-script

    Confundir Sintaxis de Quartz con POSIX

    Los documentos de AWS, los tutoriales de Spring y muchas respuestas de Stack Overflow muestran expresiones cron de Quartz con `?`, `L`, `W` o `#`. Estas no funcionan en crontab de Linux. Si copias una expresión de seis campos con `?` en el slot de día de la semana, el parser de Linux la rechazará (o peor, la mal-analizará silenciosamente). Esta herramienta detecta operadores de Quartz y explica la diferencia.

    ✗ Incorrecto
    # Quartz: 'último viernes del mes', inválido en POSIX
    0 0 ? * 6L *
    ✓ Correcto
    # Enfoque de script wrapper POSIX para último-viernes
    0 0 25-31 * 5  /tu-script
    # Ejecutar en viernes entre el 25 y el 31 de cualquier mes

    Casos de Uso Comunes

    Trabajos de Crontab en Linux
    Construye y verifica entradas para `/etc/crontab`, `/etc/cron.d/*` o archivos `crontab -e` por usuario. Usa la vista previa de próxima ejecución para confirmar que la programación cae a la hora correcta en la zona horaria configurada de tu servidor antes de guardar.
    Programaciones de CronJob de Kubernetes
    Genera el campo `spec.schedule` para un CronJob de Kubernetes. Kubernetes 1.27+ también soporta `spec.timeZone`: usa el toggle UTC para diseñar tu programación en UTC y luego configura `timeZone` explícitamente para evitar la hora local del nodo worker.
    Workflows Programados de GitHub Actions
    Construye la entrada `cron:` bajo `on.schedule`. GitHub Actions corre siempre en UTC: cambia la vista previa a UTC para confirmar tu programación. Evita intervalos menores a 15 minutos; el scheduler de GitHub omite trabajos de intervalo corto bajo carga.
    Reglas de AWS EventBridge
    Compón la expresión cron para una regla programada de EventBridge. Nota: AWS usa sintaxis Quartz de seis campos con `?` para día de la semana; esta herramienta emite POSIX de cinco campos, que necesitarás convertir prefijando segundos (`0`) y reemplazando el `*` en uno de los campos de día con `?`.
    Pipelines Programadas de GitLab CI
    Verifica la expresión cron para una pipeline CI programada en GitLab. GitLab usa sintaxis POSIX de cinco campos, lo que esta herramienta emite, y un selector de fecha en UI, pero el formato cron te da control más fino para intervalos no estándar.
    Cron Triggers de Cloudflare Workers
    Construye la entrada `[triggers.crons]` en `wrangler.toml`. Cloudflare usa sintaxis POSIX de cinco campos. El intervalo mínimo es un minuto; el worker corre en UTC. Usa la vista previa para verificar que el trigger se dispara dentro de tu ventana esperada.
    Programaciones node-cron de Node.js
    Construye expresiones para la librería `node-cron`, que soporta tanto POSIX de cinco campos como un campo inicial opcional de segundos. Mantente en cinco campos a menos que necesites específicamente precisión sub-minuto: las expresiones de seis campos no se portan al crontab de Linux.
    Revisión de Código y Documentación
    Pega una expresión cron de un PR o runbook para ver al instante qué hace, sin más adivinanzas con `30 7 * * 1-5` ni sacar una tarjeta de referencia. La descripción en lenguaje natural también es excelente para comentarios inline y archivos README.

    Referencia de Sintaxis Cron

    Orden de Campos: M H D M W
    Minuto (0-59), Hora (0-23), Día del mes (1-31), Mes (1-12), Día de la semana (0-6, 7 también = domingo). Mnemotécnico: "Mi Hora Determina Mi Semana". El campo día de la semana acepta tanto tokens numéricos (0-6) como con nombre (SUN-SAT, sin distinguir mayúsculas).
    Operadores
    `*` = cualquier valor; `,` = separador de lista (`1,3,5`); `-` = rango (`1-5`); `/` = paso (`*/15`, `5/10`); nombres: JAN-DEC para mes, SUN-SAT para día de la semana (sin distinguir mayúsculas).
    Macros (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` es una no-programación especial (solo se ejecuta al arrancar) y se rechaza con un error explicativo.
    Semántica POSIX de Día (Regla OR)
    Cuando AMBOS día del mes y día de la semana están restringidos (ninguno es `*`), la programación se ejecuta cuando CUALQUIERA coincide, semántica OR. Cuando solo uno está restringido, ese decide. Cuando ambos son `*`, cualquier día coincide. Esta regla OR aplica a vixie cron, BSD cron y la mayoría de implementaciones POSIX; Quartz usa `?` para desambiguar AND vs OR.
    Modo de Seis Campos (Quartz-Lite)
    Si tu entrada tiene seis tokens separados por espacio, la herramienta trata el primero como campo de segundos (0-59). Útil para Quartz, `@Scheduled(cron=...)` de Spring y node-cron. NO es portable a crontab de Linux ni schedulers POSIX: tratarían tus segundos como minutos y desplazarían todo una posición.
    Anclaje del Operador de Paso
    `*/N` está anclado al valor más bajo del campo: `*/15` en minuto = `0,15,30,45`, no "cada 15 empezando ahora". Con una base no comodín: `5/15` en minuto = `5,20,35,50`. Los valores de paso que no dividen el rango del campo exactamente saltarán cerca del wraparound: esto es correcto, no un bug.
    Límites de Validación
    minuto ∈ [0,59], hora ∈ [0,23], día del mes ∈ [1,31], mes ∈ [1,12], día de la semana ∈ [0,7]. Los valores fuera de rango producen un error a nivel de campo. El día del mes NO se valida contra el mes (`0 0 31 2 *` se analiza bien pero nunca coincide porque febrero no tiene día 31; la vista previa de próxima ejecución mostrará "No hay ejecuciones próximas").
    Operadores de Quartz Rechazados
    Cron POSIX no soporta los operadores de Quartz `?` (sin valor específico), `L` (último), `W` (día laborable más cercano) ni `#` (n-ésimo día de la semana). Esta herramienta los rechaza con un mensaje claro "Operadores de Quartz no soportados" en lugar de analizarlos silenciosamente como POSIX inválido. Para programaciones Quartz, usa una herramienta consciente de Quartz o el scheduler de Spring.
    Límite Anual en la Búsqueda de Próxima Ejecución
    El cálculo de próxima ejecución busca hasta 4 años hacia adelante; las expresiones que coinciden con menor frecuencia (p. ej. patrones "29 de febrero") mostrarán "No hay ejecuciones próximas en los siguientes 4 años". Es por diseño, para evitar iteración no acotada en patrones imposibles.

    Buenas Prácticas para Programaciones Cron

    Usa UTC en Servidores, Convierte al Mostrar
    Configura tus servidores en UTC (`/etc/timezone` o `TZ=UTC`) y escribe todas las expresiones cron en UTC. Convierte a hora local solo al mostrar en tus dashboards y reportes. Esto elimina toda una categoría de bugs de zona horaria que pegan más fuerte durante las transiciones de horario de verano, cuando las programaciones en hora local se disparan dos veces silenciosamente o saltan una ejecución. Usa el toggle UTC en esta herramienta para diseñar tu programación en UTC desde el principio.
    Evita la Trampa POSIX OR de Día del Mes / Día de la Semana
    Nunca restrinjas tanto día del mes COMO día de la semana a menos que quieras semántica OR. Si quieres "cada lunes en enero", escribe `0 0 * 1 1` (día del mes es `*`); si quieres "el día 1 de cada mes", escribe `0 0 1 * *` (día de la semana es `*`). La regla POSIX OR significa que `0 0 1 * 1` se ejecuta el día 1 Y cada lunes, casi seguro no es lo que pretendías. La vista previa de próxima ejecución detectará esto si revisas antes de desplegar.
    Fija la Zona Horaria de la Programación Explícitamente
    Los schedulers modernos soportan fijar la zona horaria en la definición de la programación: `CRON_TZ=America/New_York` al inicio de un crontab (vixie cron 3.0+), `spec.timeZone: "America/New_York"` para CronJobs de Kubernetes 1.27+, expresión de programación con `ScheduleExpressionTimezone` para AWS EventBridge Scheduler. Fija la zona horaria explícitamente en lugar de depender del default del servidor: las zonas horarias del servidor pueden cambiar sin aviso durante migraciones de infraestructura.
    Distribuye la Carga Entre Minutos, No en :00
    Evita `0 * * * *` (cada hora en el minuto 0) para trabajos no críticos: a escala, programar muchas cosas exactamente en :00 crea picos de carga. Elige un desplazamiento de minuto aleatorio (`23 * * * *`, `41 * * * *`) para cada trabajo para distribuir la carga. Lo mismo aplica para trabajos diarios: `30 3 * * *` es más amigable con tu base de datos que `0 3 * * *` cuando muchos trabajos convergen a las 3:00.
    Haz los Trabajos Idempotentes
    Cron no tiene reintento integrado, ni prevención de superposición, ni recuperación de ejecuciones perdidas. Tu trabajo debe ser seguro de ejecutar múltiples veces (idempotente) y auto-verificable. En lugar de "enviar reporte a las 9 AM", diséñalo como "enviar el reporte de hoy si aún no se ha enviado": esto se auto-repara tras caídas, programaciones duplicadas accidentales y ejecuciones concurrentes. La idempotencia es una propiedad del trabajo, no del scheduler, y es la práctica de fiabilidad más importante.
    Añade un Heartbeat para Programaciones Críticas
    El modo de fallo silencioso de cron es su mayor debilidad: si la programación no se dispara, nada te lo dice. Para trabajos críticos, haz que el trabajo haga ping a un servicio de heartbeat (Healthchecks.io, Cronitor, Dead Man's Snitch) al final de cada ejecución; el servicio te alerta si el ping esperado no llega. Esto detecta tanto que el trabajo falle como que la propia programación falle. La capa gratuita cubre la mayoría de necesidades personales y de equipos pequeños.
    Verifica con la Vista Previa Antes de Desplegar
    Antes de desplegar una nueva programación cron, mira las cinco próximas fechas de ejecución en la vista previa de esta herramienta. Alterna entre Local y UTC. Confirma que la programación cae cuando pretendes, no cinco minutos antes, no en el día equivocado, no saltándose el fin de semana que te importaba. La vista previa es la prueba de producción más barata posible.

    Preguntas Frecuentes

    ¿Qué hace esta herramienta?
    Analiza, valida y explica expresiones cron en tu navegador, con una vista previa en vivo de las próximas cinco ejecuciones programadas en tu zona horaria o UTC. Escribe cualquier expresión cron POSIX estándar de cinco campos, o usa los chips de preset y los campos individuales para construir una sin memorizar la sintaxis, y la herramienta produce una descripción en lenguaje natural ("Cada 15 minutos", "Días laborables a las 9:00 AM", etc.) más las fechas y horas reales en que el trabajo se disparará. Las expresiones incorrectas se detectan al instante con un mensaje de error a nivel de campo, así no desperdicias un despliegue con una programación rota. La herramienta entera corre 100% del lado del cliente: nada se sube, se registra ni se almacena, segura para crontabs de producción y programaciones internas con patrones de tiempo sensibles.
    ¿Qué es una expresión cron?
    Una expresión cron es una cadena de cinco campos que define una programación recurrente. Los campos son minuto (0-59), hora (0-23), día del mes (1-31), mes (1-12) y día de la semana (0-6, donde 0 y 7 significan domingo). Cada campo acepta un valor, una lista (`1,3,5`), un rango (`1-5`), un comodín (`*` = cualquiera) o un paso (`*/15` = cada 15). La combinación de los cinco campos define exactamente cuándo debe ejecutarse el comando programado. Cron se originó en Unix V7 (1979) y sigue siendo el lenguaje de facto para programación de trabajos basada en tiempo en Linux/Unix, en orquestación de contenedores (CronJobs de Kubernetes), en CI/CD (GitHub Actions, GitLab CI) y en plataformas serverless (AWS EventBridge, Cron Triggers de Cloudflare Workers). A pesar de las muchas alternativas propuestas a lo largo de las décadas, ningún reemplazo ha desplazado a la gramática terse y expresiva de cinco campos de cron.
    ¿Mis datos se suben a algún lado?
    No. Todo el análisis, validación y cálculo de próxima ejecución corre 100% del lado del cliente en tu navegador usando JavaScript. Tus expresiones nunca se transmiten, nunca se almacenan en ningún servidor, nunca se registran y nunca se analizan. Esto hace que la herramienta sea segura para crontabs de producción, patrones internos de programación que revelen tiempos de infraestructura y cualquier programación sensible. Puedes verificarlo en la pestaña de Red de tu navegador: escribir una expresión cron genera cero peticiones de red. La herramienta no usa cookies para datos de entrada ni analítica de terceros que capture lo que escribes.
    ¿Cuál es la diferencia entre cron POSIX y Quartz?
    Cron POSIX es el estándar de cinco campos usado por crontab de Unix/Linux, timers de systemd, GitHub Actions, GitLab CI, AWS EventBridge, CronJobs de Kubernetes y la mayoría de schedulers. Quartz es una librería de scheduling de Java que añade un campo de segundos (seis o siete campos en total) más operadores extra: `?` (sin valor específico, usado cuando día del mes y día de la semana entran en conflicto), `L` (último: último día del mes, último viernes, etc.), `W` (día laborable más cercano) y `#` (n-ésimo día de la semana del mes, p. ej. `2#1` = primer martes). Esta herramienta implementa cron POSIX porque es mucho más usado; los operadores de Quartz se reportan como errores de sintaxis con un mensaje claro "Operadores de Quartz no soportados". Si necesitas Quartz, schedulers de Java populares como Quartz Scheduler y `@Scheduled` de Spring son tu objetivo, pero las definiciones de programación no se portan directamente a cron de Linux.
    ¿Por qué '0 0 1 * 5' se ejecuta cada viernes Y el día 1?
    Es la semántica OR de día del mes / día de la semana de cron POSIX, y es la sorpresa más común de cron. La regla: cuando AMBOS campos están restringidos (ninguno es `*`), cron ejecuta el trabajo si CUALQUIERA condición coincide, no ambas. Así que `0 0 1 * 5` (día del mes=1, día de la semana=5) se dispara el día 1 de cada mes Y todos los viernes, no solo los viernes que caen en día 1. Si querías solo lo último (semántica AND: viernes-que-caigan-en-1), no puedes expresarlo en cron estándar; necesitarías un script que se ejecute cada viernes O el día 1 y salga temprano según la fecha real. Vixie cron (el default de GNU/Linux), BSD cron y AWS EventBridge siguen esta regla OR. La vista previa de próxima ejecución en esta herramienta deja la programación real en evidencia: pega expresiones sospechosas y verifica antes de desplegar.
    ¿Cómo ejecuto un trabajo cada 30 segundos?
    No puedes, con cron POSIX estándar. La granularidad mínima de cron es un minuto: el campo más pequeño es minuto (0-59). Para programaciones sub-minuto, tus opciones son: (1) Ejecutar dos trabajos a `* * * * *` y `* * * * *` con `sleep 30 &&` delante de uno: tosco pero funciona en vixie cron. (2) Usar un scheduler con soporte de segundos como Quartz, CronJob de Kubernetes con un controlador personalizado o timers de systemd con `OnCalendar: *-*-* *:*:00/30`. (3) Correr un daemon de larga vida que duerma 30 segundos entre iteraciones: la respuesta correcta para la mayoría de necesidades de monitoreo. (4) Cambiar a un trigger basado en eventos (webhook, cola de mensajes) si realmente necesitas respuesta en tiempo real. El patrón de cron cada 30 segundos casi siempre es señal de que cron es la abstracción equivocada.
    ¿Qué zona horaria usa cron?
    En un servidor Linux, vixie cron usa la zona horaria del sistema, generalmente configurada vía `/etc/timezone` o la variable de entorno `TZ`. Es una fuente frecuente de bugs: un cron de 9:00 AM en un servidor de US East se dispara a las 14:00 UTC, pero en un servidor configurado en UTC se dispara a las 09:00 UTC (es decir, 4:00 AM en US East). La solución es siempre configurar tus servidores en UTC y escribir todas las expresiones cron en UTC, o configurar la variable `CRON_TZ=America/New_York` al inicio del crontab para fijar la zona horaria explícitamente (soportado por vixie cron 3.0+). Los schedulers gestionados varían: GitHub Actions corre siempre en UTC, AWS EventBridge soporta zona horaria en la definición de la programación, CronJob de Kubernetes añadió un campo `spec.timeZone` en 1.27+. El toggle UTC/Local de esta herramienta te permite previsualizar la programación en cualquiera de las dos zonas; cambia entre ellas para confirmar que la ejecución cae donde pretendías.
    ¿A qué se expande realmente '*/15'?
    El operador de paso `*/N` significa "cada N empezando en el valor válido más bajo del campo". Para minuto (rango 0-59), `*/15` se expande a `0,15,30,45`: cuatro ejecuciones por hora en los cuartos de hora. El paso NO es "cada 15 minutos desde la hora actual"; está anclado al valor inicial del campo. Misma lógica para otros campos: `*/2` en hora significa `0,2,4,...,22` (12 ejecuciones); `*/3` en día del mes significa `1,4,7,...,31` (11 ejecuciones). Para bases de paso que no son comodín (p. ej. `5/15`), la expansión parte de la base: `5/15` en minuto = `5,20,35,50`. Los valores de paso que no dividen el rango exactamente saltarán cerca del wraparound: es comportamiento correcto de cron, no un bug. La vista previa de próxima ejecución deja la programación real en evidencia.
    ¿Puedo usar una expresión de seis campos con segundos?
    Las expresiones de seis campos con un campo inicial de segundos (rango 0-59) son una extensión de Quartz/Spring/Cron4j, no POSIX. Esta herramienta acepta expresiones de seis campos cuando la entrada tiene exactamente seis tokens separados por espacio, útil si apuntas a Quartz, `@Scheduled(cron=...)` de Spring o librerías de Node.js como `node-cron` que soportan segundos. Para schedulers POSIX estándar (crontab de Linux, GitHub Actions, AWS EventBridge, CronJob de Kubernetes), mantente en cinco campos: añadir un campo inicial de segundos romperá silenciosamente la programación (el scheduler interpretará tus segundos como minutos, tu hora como minuto, etc., desplazando todo una posición). En caso de duda, revisa la documentación de tu scheduler objetivo; si no dice explícitamente "se soporta seis campos con segundos", usa cinco campos.
    ¿Cuál es el intervalo máximo que cron puede expresar?
    Sin estado externo, cron puede expresar de manera fiable hasta una vez al año con `0 0 D M *` (p. ej. `0 0 1 1 *` = cada 1 de enero a medianoche). Para "cada dos años" o intervalos más largos, cron solo no basta; necesitarías un chequeo de fecha externo al inicio de tu script (p. ej. `[ $(($(date +%Y) % 2)) -eq 0 ] && /tu-comando` para correr en años pares). Para "cada 90 días" u otros intervalos multi-día no alineados, cron también falla: no existe operador módulo-día nativo, así que escribirías un wrapper que compare el día del año contra una fecha de referencia. Si tus necesidades de scheduling son tan complejas, considera un orquestador real de workflows (Airflow, Temporal, AWS Step Functions): la gramática de cron es intencionalmente simple y se rompe para cualquier cosa más allá de patrones semanales/mensuales regulares.
    ¿Cómo manejo ejecuciones perdidas después de una caída?
    Cron estándar no tiene recuperación: si el sistema estaba caído a la hora programada, la ejecución simplemente se omite. No hay registro de "se perdió esta". Para trabajos críticos tienes tres opciones: (1) Usar `anacron` (o `systemd-cron` con `Persistent=true`), que recupera trabajos perdidos después del arranque, adecuado para portátiles y sistemas intermitentes. (2) Cambiar a un scheduler con reintentos integrados: los CronJobs de Kubernetes tienen `startingDeadlineSeconds` (ejecutar si el retraso está dentro del deadline) y `concurrencyPolicy` (evitar ejecuciones superpuestas); AWS EventBridge soporta políticas de reintento. (3) Construir idempotencia en el propio trabajo: en lugar de "ejecutar reporte a las 9 AM", haz que el trabajo consulte "¿se generó el reporte de hoy?" y lo produzca si no, esto se auto-repara tras cualquier duración de caída. La opción 3 es la más robusta y funciona con cualquier scheduler.
    ¿Por qué mi cron de GitHub Actions no se ejecuta a tiempo?
    Las programaciones de GitHub Actions son best-effort: pueden dispararse hasta varios minutos tarde bajo alta carga en la infraestructura de GitHub, y bajo carga muy alta pueden omitirse por completo (especialmente para intervalos cortos como cada cinco minutos). El mismo disclaimer aplica a la mayoría de schedulers gestionados: cambian tiempo exacto por escala y fiabilidad. Implicaciones prácticas: (1) No programes cosas que deban correr en un segundo exacto; cron es para "aproximadamente a esta hora, diariamente". (2) Para intervalos cortos, prefiere un worker de larga vida sobre un trabajo programado. (3) Para cortes financieros o de cumplimiento con hora exacta, usa un daemon de cron dedicado en un servidor que controles, o un scheduler más estricto como AWS EventBridge Scheduler con la programación Standard. (4) Específico de GitHub Actions: evita intervalos menores a 15 minutos; el scheduler suele omitirlos bajo carga.

    Herramientas relacionadas

    Ver todas las herramientas →