Generador de Expresiones Cron
Generador y analizador visual para expresiones de programación Cron
¿Qué es una Expresión Cron?
Una expresión Cron describe horarios recurrentes para tareas programadas. Según el planificador, puede tener cinco, seis o siete campos para minuto, hora, día del mes, mes, día de la semana, segundos opcionales y año opcional. Símbolos como asteriscos, comas, rangos, pasos, signos de interrogación y marcadores especiales permiten reglas como “cada 5 minutos”, “días laborables a las 9” o “el último día del mes”. La herramienta ayuda a leer, validar y previsualizar próximas ejecuciones para no depender de memoria. El contexto importa: cron de Linux, Quartz, planificadores cloud y frameworks difieren en campos, zona horaria y sintaxis.
Cómo usar
Cómo usar
- Selecciona el modo Generar o Analizar
- Configura los campos de tiempo (segundo, minuto, hora, día, mes, día de la semana) mediante menús desplegables
- Haz clic en los preajustes para rellenar rápidamente expresiones comunes
- El modo Generar muestra la expresión y las próximas 5 ejecuciones
- El modo Analizar valida expresiones existentes y muestra las horas de ejecución
Símbolos de sintaxis
- * — Todos los valores posibles
- , — Lista varios valores (ej. 1,3,5)
- - — Rango (ej. 1-5)
- / — Intervalo de paso (ej. */5 significa cada 5)
- ? — Sin valor específico (para día o día de la semana)
- L — Último día del mes o la semana
- W — Día laborable más cercano
- # — N-ésimo día de la semana (ej. 2#3 = 3.er martes)
Notas de desarrollo
- Usa el resultado como referencia rápida y luego pruébalo en el código real, la compilación o el contexto de la API.
- Ten en cuenta versiones, dialectos, variables de entorno y convenciones del proyecto.
Notas importantes
- Los campos de día y día de la semana no pueden tener ambos valores; uno debe usar ?
- Cada campo tiene rangos válidos: minuto 0-59, hora 0-23
- El orden de los campos es fijo: seg min hora día mes día_semana año
- El día de la semana no distingue mayúsculas y minúsculas; MON y mon son equivalentes
Casos de uso
Principio técnico
Una expresión cron codifica cero o más restricciones de coincidencia temporal en campos con un orden fijo. El cron clásico Vixie/BSD (usado por Linux crond) utiliza 5 campos: minuto (0-59), hora (0-23), día del mes (1-31), mes (1-12 o JAN-DEC) y día de la semana (0-6 o SUN-SAT, siendo 0 domingo por convención). El planificador Quartz, popularizado por Spring y la biblioteca Egistix, añade un campo de segundos al inicio para 6 campos y un campo de año opcional al final para 7. Cada campo puede contener un valor literal, una lista (1,3,5), un rango (1-5), un paso (0/15 que significa cada 15 empezando en 0) o el comodín * que coincide con todos los valores. El signo de interrogación ? es un centinela exclusivo de Quartz que significa "sin valor específico" y DEBE aparecer exactamente en una de las posiciones día del mes o día de la semana cuando la otra tiene una restricción. El cálculo de las próximas N ejecuciones utiliza un algoritmo voraz de búsqueda hacia adelante: se parte del instante de referencia (normalmente ahora), se incrementa el campo de nivel más bajo que no coincide con la restricción, se reinician todos los campos inferiores a su mínimo y se produce un cascada hacia campos superiores cuando un campo se desborda (por ejemplo, minutos al pasar de 59, horas al pasar de 23). Este es el método iterativo de Donovan/Spoonhour y funciona en O(K x F), donde K es el número de candidatos (normalmente 5) y F es el número de campos. Los nombres de días (MON, FRI, etc.) se convierten a minúsculas para la comparación y las abreviaturas de meses también se aceptan. El carácter especial L en Quartz se resuelve a la última aparición de un día de la semana en el mes (por ejemplo, 0 0 0 ? * 5L es el último viernes), calculando hacia atrás desde el último día del mes para encontrar el día solicitado. El carácter W encuentra el día laborable más cercano (lunes-viernes) a un día del mes dado, saltando al mes adyacente si es necesario. El manejo de zonas horarias es la configuración errónea más común: la expresión en sí no contiene metadatos de zona horaria, por lo que la misma 0 0 9 * * ? se activa en diferentes desplazamientos UTC en servidores de America/New_York frente a Asia/Tokyo frente a UTC. Las abreviaturas como @daily (0 0 0 * * ?), @hourly (0 0 * * * ?), @reboot (se ejecuta una vez al iniciar el demonio, no es una expresión temporal) y @weekly (0 0 0 ? * 1) se expanden a su forma equivalente de 6 campos antes del análisis. Un error frecuente es la conjunción día del mes + día de la semana: en cron clásico la tarea se ejecuta cuando cualquiera de los dos coincide (lógica OR), mientras que algunos dialectos más recientes cambian a lógica AND. La expresión 0 0 0 15 * 5 significa "a medianoche del día 15 Y cada viernes" en Vixie cron, no "a medianoche del día 15 O el viernes" como muchos principiantes asumen. El problema Y2038 no afecta directamente a cron (usa time_t), pero cualquier dispositivo embebido que ejecute un crond Unix de 32 bits desbordará el entero con signo de 32 bits de time_t el 19 de enero de 2038 a las 03:14:07 UTC.
- Clásico de 5 campos: min hora dom mes ds; Quartz añade seg (6 campos) y opcionalmente año (7 campos).
- ? debe ocupar una de las posiciones dom/ds cuando la otra tiene un valor; * coincide con todos los valores de ese campo.
- Día del mes + día de la semana es OR en Vixie cron, AND en algunos planificadores más recientes: verifica antes de desplegar.
- L se resuelve al último día de la semana del mes: por ejemplo, 0 0 0 ? * 5L = último viernes, calculado a partir de la longitud del mes.
- W encuentra el día laborable más cercano (lunes-viernes) a una fecha dada; puede cruzar al mes adyacente.
- La expresión cron no contiene metadatos de zona horaria: la misma expresión se activa en hora local del servidor, UTC o una zona con nombre según el planificador.
- Y2038: time_t de 32 bits se desborda el 19 de enero de 2038 a las 03:14:07 UTC; los crond en sistemas embebidos heredados se verán afectados.
- Las abreviaturas @hourly/@daily/@midnight/@weekly/@monthly/@yearly/@reboot se expanden a expresiones equivalentes de 5 o 6 campos.
- El operador paso / cuenta desde el valor más a la izquierda: 2/3 en hora se activa a las 2, 5, 8, 11, 14, 17, 20, 23.
- Búsqueda voraz hacia adelante en O(KxF) con cinco iteraciones para calcular las próximas N ejecuciones desde un instante de referencia.
Ejemplos
Cada día a medianoche (copia de seguridad diaria)
Expresión : 0 0 * * *
Significa : A las 00:00 todos los días
Próximas : 2026-06-11 00:00, 2026-06-12 00:00, 2026-06-13 00:00
Caso de uso : Copia de base de datos, generación de informe diarioCada 15 minutos (verificación de salud)
Expresión : */15 * * * *
Significa : En los minutos 0, 15, 30, 45 de cada hora
Próximas : 14:00, 14:15, 14:30, 14:45, 15:00
Caso de uso : Verificación de salud de API, sondeo de cola, tareas de sincronizaciónDías laborables a las 9:00 AM (notificador en horario laboral)
Expresión : 0 9 * * 1-5
Significa : 09:00 de lunes a viernes
Próximas : Lun 09:00, Mar 09:00, Mié 09:00, Jue 09:00, Vie 09:00
Caso de uso : Recordatorio de stand-up, resumen diario en SlackEl primer día de cada mes a las 03:30 (facturación mensual)
Expresión : 30 3 1 * *
Significa : 03:30 el día 1 de cada mes
Próximas : Jul 1 03:30, Ago 1 03:30, Sep 1 03:30
Caso de uso : Emisión mensual de facturas, rotación de logs, archivadoCada domingo a medianoche (limpieza semanal)
Expresión : 0 0 * * 0
Significa : 00:00 cada domingo (0 = Domingo en cron de Linux)
Próximas : Dom 00:00, Dom 00:00, Dom 00:00
Caso de uso : Correo de informe semanal, purga de caché, reentrenamientoQuartz con segundos - cada 30 segundos
Expresión : */30 * * * * ?
Significa : Cada 30 segundos (sintaxis Quartz de 6 campos)
Próximas : 14:00:00, 14:00:30, 14:01:00, 14:01:30
Nota : Día de la semana es ?, porque día del mes es *. Usa Quartz, no cron de Linux, para este formato.Preguntas frecuentes
¿Qué formatos de cron son compatibles?
Cron estándar de 5 campos (minuto hora díaDelMes mes díaDeLaSemana), de 6 campos con segundos (usado por Quartz, Spring y muchos planificadores en la nube) y de 7 campos con año opcional. La página te permite elegir el formato y explica cada campo mientras construyes la expresión.
¿Por qué dayOfMonth y dayOfWeek son ambos campos?
El cron estándar los trata como OR: «el primer día del mes O todos los lunes» dispara con cualquiera de las dos condiciones. Para combinarlos con AND, normalmente necesitas la sintaxis no estándar con ? (Quartz) o algún truco. La página muestra los próximos disparos para que verifiques visualmente tu intención.
¿La planificación se ejecutará realmente en mi sistema?
No: esta página genera y valida la expresión, pero la tarea la ejecuta tu planificador (cron de Linux, GitHub Actions, Kubernetes CronJob, AWS EventBridge, Quartz, etc.). Distintos planificadores tienen dialectos de cron ligeramente diferentes; elige el formato adecuado para tu destino.
¿Qué zona horaria usa la planificación?
El cron estándar de Unix usa la zona horaria local del sistema. Los planificadores en la nube varían: AWS EventBridge usa UTC por defecto, GitHub Actions usa UTC por defecto y Kubernetes CronJob usa la zona horaria del API server. Lee la documentación de tu planificador y recuerda que los cambios de horario de verano pueden disparar tareas en momentos inesperados.
¿Cómo expreso «cada 30 minutos»?
*/30 * * * * (minuto = 0,30; cada hora, día, mes y día de la semana). Para «cada 15 minutos solo en horario laboral»: */15 9-17 * * 1-5 (también se restringe a las 9-17:00 de lunes a viernes). La página muestra los próximos 5-10 disparos para confirmarlo.
¿Es seguro usar esto para planificaciones de producción reales?
La página solo genera la expresión; ejecutar la tarea es trabajo de tu planificador. Prueba la expresión primero con una ejecución de muestra (la mayoría de planificadores tienen una opción de «ejecución manual») y evita programar tareas a medianoche (00:00), donde muchas tareas del sistema coinciden y provocan picos.
¿Se sube algo a un servidor?
No. La expresión se analiza y los próximos disparos se calculan en tu navegador con una librería JavaScript de cron.