Validador de expresiones Cron
Valida expresiones cron y ve un desglose detallado campo por campo
Expresión cron
minute hour day(month) month day(week)
Desglose de campos
*/15(0–59)Se expande a: 0, 15, 30, 45
0-6(0–23)Se expande a: 0, 1, 2, 3, 4, 5, 6
1,15(1–31)Se expande a: 1, 15
*(1–12)Se expande a: all (1–12)
1-5(0–6)Se expande a: 1, 2, 3, 4, 5
¿Qué es la validación de expresiones cron?
La validación de expresiones cron es el proceso de comprobar si una cadena cron sigue las reglas de sintaxis correctas antes de que llegue a un planificador. Una expresión cron usa cinco campos separados por espacios (minuto, hora, día del mes, mes, día de la semana) para definir una programación recurrente. Si algún campo contiene un valor fuera de rango, un operador inválido o un error estructural como un número de campos incorrecto, la expresión será rechazada por el planificador en el momento del despliegue o fallará silenciosamente sin coincidir con ningún momento de disparo.
Validar una expresión cron online detecta errores antes que desplegar en producción y esperar a que se pierda una tarea. Los errores típicos incluyen escribir 25 en el campo de hora (rango válido: 0-23), usar un paso de cero (*/0, que no está definido), invertir los límites de un rango (5-1 en lugar de 1-5), o añadir campos adicionales que pertenecen a formatos no estándar como Quartz. Un verificador de sintaxis señala estos problemas al instante e indica exactamente qué campo es incorrecto.
La validación cron es diferente del análisis cron. Un analizador toma una expresión válida y la traduce a una programación legible. Un validador responde una pregunta más sencilla: ¿está bien formada esta expresión? Valida antes de analizar — no tiene sentido pasar una expresión inválida a un planificador. En pipelines de CI/CD, la validación automática de cron evita que programaciones rotas lleguen a los archivos de configuración.
¿Por qué usar este validador de cron?
Una expresión cron tiene reglas de sintaxis estrictas, y los planificadores dan mensajes de error inconsistentes cuando se violan esas reglas. Algunos planificadores rechazan la expresión con un error críptico; otros la aceptan silenciosamente y nunca la disparan. Este validador te da un diagnóstico claro, campo por campo, antes de desplegar.
Casos de uso del validador de cron
Errores comunes de sintaxis cron
La tabla a continuación lista los errores más frecuentes en expresiones cron y sus causas. Son los errores que aparecen repetidamente en configuraciones de producción y pipelines de CI/CD.
| Tipo de error | Ejemplo | Qué salió mal |
|---|---|---|
| Too few fields | 0 9 * * | Missing the day-of-week field. Standard cron requires exactly 5 fields. |
| Too many fields | 0 0 9 * * 1 2026 | Extra fields. Some tools add seconds or year, but standard cron uses 5. |
| Value out of range | 0 25 * * * | Hour field accepts 0-23. Value 25 exceeds the maximum. |
| Invalid step base | 0 0 32/2 * * | Day-of-month starts at 32, which exceeds the 1-31 range. |
| Step of zero | */0 * * * * | Step value must be 1 or greater. Zero creates an infinite loop. |
| Empty field | 0 9 * * 1 | Double space creates an empty field. Each field needs a value. |
| Invalid character | 0 9 * * Mon-Fry | Typo in day name. Use three-letter abbreviations: MON, TUE, WED, THU, FRI, SAT, SUN. |
| Reversed range | 0 9 * * 5-1 | Range end (1) is less than start (5). Write 1-5 or use a list: 5,6,0,1. |
Expresiones cron válidas e inválidas
Una referencia rápida de expresiones bien formadas junto a errores comunes. Úsala para verificar tu expresión antes de pegarla en una configuración de planificador.
Ejemplos de código
Cómo validar expresiones cron mediante programación en JavaScript, Python, Go y Bash. Cada ejemplo muestra cómo detectar sintaxis inválida y extraer un mensaje de error significativo.
import { parseExpression } from 'cron-parser';
// Validate a cron expression by attempting to parse it
function validateCron(expr) {
try {
parseExpression(expr);
return { valid: true, error: null };
} catch (err) {
return { valid: false, error: err.message };
}
}
console.log(validateCron('0 9 * * 1-5'));
// → { valid: true, error: null }
console.log(validateCron('0 25 * * *'));
// → { valid: false, error: "Constraint error, got value 25 expected range 0-23" }
// Validate with field-level detail using cron-validator
import { isValidCron } from 'cron-validator';
isValidCron('*/15 * * * *'); // → true
isValidCron('*/15 * * * *', { seconds: true }); // → false (expects 6 fields)
isValidCron('0 0 31 2 *'); // → true (syntactically valid, Feb 31 never fires)from croniter import croniter
# Validate by checking if croniter can parse the expression
def validate_cron(expr: str) -> dict:
if croniter.is_valid(expr):
return {"valid": True, "error": None}
# Get a more specific error message
try:
croniter(expr)
except (ValueError, KeyError) as e:
return {"valid": False, "error": str(e)}
return {"valid": False, "error": "Unknown error"}
print(validate_cron("0 9 * * 1-5"))
# → {'valid': True, 'error': None}
print(validate_cron("0 25 * * *"))
# → {'valid': False, 'error': '...out of range...'}
print(validate_cron("* * *"))
# → {'valid': False, 'error': 'Exactly 5 or 6 columns...'}
# Field-level validation
from crontab import CronTab
cron = CronTab(tab="")
job = cron.new(command="/bin/true")
try:
job.setall("0 9 * * 1-5")
print(job.is_valid()) # → True
except Exception as e:
print(f"Invalid: {e}")package main
import (
"fmt"
"github.com/robfig/cron/v3"
)
// ValidateCron checks whether a 5-field cron expression is syntactically correct
func ValidateCron(expr string) (bool, error) {
parser := cron.NewParser(
cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow,
)
_, err := parser.Parse(expr)
if err != nil {
return false, err
}
return true, nil
}
func main() {
exprs := []string{
"0 9 * * 1-5", // valid
"0 25 * * *", // invalid: hour 25
"*/15 * * * *", // valid
"0 0 32 * *", // invalid: day 32
}
for _, e := range exprs {
ok, err := ValidateCron(e)
if ok {
fmt.Printf("%-20s VALID
", e)
} else {
fmt.Printf("%-20s INVALID: %v
", e, err)
}
}
}#!/bin/bash
# Validate cron syntax using Python one-liner
validate_cron() {
python3 -c "
from croniter import croniter
import sys
expr = sys.argv[1]
if croniter.is_valid(expr):
print(f'VALID: {expr}')
sys.exit(0)
else:
print(f'INVALID: {expr}')
sys.exit(1)
" "$1"
}
validate_cron "0 9 * * 1-5" # → VALID: 0 9 * * 1-5
validate_cron "0 25 * * *" # → INVALID: 0 25 * * *
# Quick regex pre-check (catches field count and obvious issues)
cron_regex='^([0-9*/,-]+\s+){4}[0-9*/,-]+$'
echo "*/5 * * * *" | grep -Eq "$cron_regex" && echo "passes basic check"
echo "* * *" | grep -Eq "$cron_regex" || echo "fails basic check"