Cron Expression Validator
Проверяйте cron-выражения и получайте подробный разбор по каждому полю
Cron-выражение
minute hour day(month) month day(week)
Разбор по полям
*/15(0–59)Разворачивается в: 0, 15, 30, 45
0-6(0–23)Разворачивается в: 0, 1, 2, 3, 4, 5, 6
1,15(1–31)Разворачивается в: 1, 15
*(1–12)Разворачивается в: all (1–12)
1-5(0–6)Разворачивается в: 1, 2, 3, 4, 5
Что такое валидация cron-выражений?
Валидация cron-выражений — это проверка того, соответствует ли cron-строка правилам синтаксиса, прежде чем она попадёт в планировщик. Cron-выражение состоит из пяти полей, разделённых пробелами (минута, час, день месяца, месяц, день недели), которые определяют повторяющееся расписание. Если какое-либо поле содержит значение вне допустимого диапазона, недопустимый оператор или структурную ошибку — например, неверное количество полей — выражение будет отклонено планировщиком при деплое или молча не найдёт ни одного момента срабатывания.
Проверка cron-выражения онлайн позволяет обнаружить ошибки раньше, чем при деплое в production с ожиданием пропущенного задания. Типичные ошибки: значение 25 в поле часа (допустимый диапазон: 0–23), шаг равный нулю (*/0, поведение которого не определено), перевёрнутые границы диапазона (5-1 вместо 1-5), или лишние поля нестандартных форматов, таких как Quartz. Синтаксический валидатор мгновенно выявляет эти проблемы и указывает, какое именно поле неверно.
Валидация cron отличается от парсинга cron. Парсер принимает корректное выражение и переводит его в понятное для человека описание расписания. Валидатор отвечает на более простой вопрос: правильно ли сформировано это выражение? Проверяйте перед парсингом — нет смысла передавать некорректное выражение в планировщик. В CI/CD-пайплайнах автоматическая валидация cron предотвращает попадание нерабочих расписаний в конфигурационные файлы.
Зачем использовать этот валидатор cron?
Cron-выражения подчиняются строгим синтаксическим правилам, а планировщики дают непоследовательные сообщения об ошибках при их нарушении. Одни планировщики отклоняют выражение с непонятной ошибкой, другие молча принимают его и никогда не срабатывают. Этот валидатор даёт вам чёткий диагноз по каждому полю до деплоя.
Сценарии использования валидатора cron
Распространённые синтаксические ошибки cron
В таблице ниже перечислены наиболее частые ошибки в cron-выражениях и их причины. Именно эти ошибки регулярно встречаются в конфигурациях production-сред и CI/CD-пайплайнах.
| Тип ошибки | Пример | Что пошло не так |
|---|---|---|
| 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. |
Корректные и некорректные cron-выражения
Краткий справочник правильных выражений рядом с типичными ошибками. Используйте его для самопроверки перед вставкой выражения в конфигурацию планировщика.
Примеры кода
Как проверять cron-выражения программно на JavaScript, Python, Go и Bash. В каждом примере показано, как перехватить некорректный синтаксис и получить понятное сообщение об ошибке.
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"