Cron Expression Validator

Проверяйте cron-выражения и получайте подробный разбор по каждому полю

Попробовать пример

Cron-выражение

minute hour day(month) month day(week)

Корректное cron-выражение

Разбор по полям

Minute*/15(0–59)

Разворачивается в: 0, 15, 30, 45

Hour0-6(0–23)

Разворачивается в: 0, 1, 2, 3, 4, 5, 6

Day of month1,15(1–31)

Разворачивается в: 1, 15

Month*(1–12)

Разворачивается в: all (1–12)

Day of week1-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-выражения и конфигурации расписаний никогда не отправляются на сервер и нигде не сохраняются.
🔍
Отчёт об ошибках по каждому полю
Если выражение некорректно, валидатор определяет, какое именно поле вызвало ошибку и по какой причине. Никакого угадывания, из пяти ли полей проблемное.
📋
Без регистрации
Откройте страницу и сразу начните проверку. Никакого входа в систему, API-ключа или установки. Работает на любом устройстве с современным браузером, включая мобильные.

Сценарии использования валидатора cron

Frontend-разработчик
Проверяйте cron-выражения, введённые пользователями в интерфейсах планирования, до сохранения в базу данных. Перехватывайте синтаксические ошибки на стороне клиента, не дожидаясь отклонения на бэкенде.
Backend-инженер
Проверяйте cron-выражения в конфигурациях очередей задач (Celery beat, Hangfire, Quartz) во время code review. Убеждайтесь, что отрефакторенная строка расписания по-прежнему проходит синтаксическую проверку.
DevOps / SRE
Проверяйте расписания cron в манифестах Kubernetes CronJob и конфигурациях CI/CD-пайплайнов до их применения. Предотвращайте попадание опечаток в расписания резервного копирования, которые остаются незамеченными вплоть до пропущенного бэкапа.
QA-инженер
Тестируйте корректность отклонения приложением некорректного cron-ввода. Создавайте заведомо неверные выражения (значения вне диапазона, неверное число полей) и убеждайтесь в правильной работе обработки ошибок.
Инженер по данным
Проверяйте cron-триггеры для Airflow DAG и расписаний запусков dbt. Убеждайтесь, что расписания пайплайнов, полученные из YAML- или JSON-конфигов, синтаксически корректны до деплоя.
Студент / Новичок
Экспериментируйте с синтаксисом cron и получайте мгновенную обратную связь о том, что корректно, а что нет. Изучайте диапазоны полей, операторы и граничные случаи, тестируя выражения и читая сообщения об ошибках.

Распространённые синтаксические ошибки cron

В таблице ниже перечислены наиболее частые ошибки в cron-выражениях и их причины. Именно эти ошибки регулярно встречаются в конфигурациях production-сред и CI/CD-пайплайнах.

Тип ошибкиПримерЧто пошло не так
Too few fields0 9 * *Missing the day-of-week field. Standard cron requires exactly 5 fields.
Too many fields0 0 9 * * 1 2026Extra fields. Some tools add seconds or year, but standard cron uses 5.
Value out of range0 25 * * *Hour field accepts 0-23. Value 25 exceeds the maximum.
Invalid step base0 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 field0 9 * * 1Double space creates an empty field. Each field needs a value.
Invalid character0 9 * * Mon-FryTypo in day name. Use three-letter abbreviations: MON, TUE, WED, THU, FRI, SAT, SUN.
Reversed range0 9 * * 5-1Range end (1) is less than start (5). Write 1-5 or use a list: 5,6,0,1.

Корректные и некорректные cron-выражения

Краткий справочник правильных выражений рядом с типичными ошибками. Используйте его для самопроверки перед вставкой выражения в конфигурацию планировщика.

Корректные выражения
* * * * *
0 9 * * 1-5
*/15 * * * *
0 0 1,15 * *
30 2 * * 0
0 */6 * * *
Некорректные выражения
0 9 * *4 поля, нужно 5
0 25 * * *максимум часа — 23
*/0 * * * *шаг не может быть 0
0 9 * * 8максимум дня недели — 6
60 * * * *максимум минуты — 59
0 0 0 * *минимум дня месяца — 1

Примеры кода

Как проверять cron-выражения программно на JavaScript, Python, Go и Bash. В каждом примере показано, как перехватить некорректный синтаксис и получить понятное сообщение об ошибке.

JavaScript (Node.js)
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)
Python
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}")
Go
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)
        }
    }
}
Bash
#!/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"

Часто задаваемые вопросы

Что делает cron-выражение некорректным?
Cron-выражение некорректно, если оно нарушает синтаксические правила пятипольного формата. Типичные причины: неверное количество полей (меньше 5 или больше 5 для стандартного cron), значение вне допустимого диапазона (например, час 25, минута 60, день месяца 0), шаг равный нулю (*/0), перевёрнутые границы диапазона (5-1) или нераспознанные символы. Выражение должно содержать ровно пять разделённых пробелами полей с допустимыми значениями и операторами в каждом.
Считается ли cron-выражение корректным, если оно никогда не срабатывает?
Да, синтаксически. Выражение вида 0 0 31 2 * (31 февраля) проходит синтаксическую проверку, поскольку каждое поле содержит значения в допустимых диапазонах. Но оно никогда не сработает, так как в феврале не бывает 31 дня. Большинство валидаторов проверяют только синтаксис, а не семантическую корректность. Если нужно обнаруживать недостижимые расписания — вычислите следующие N моментов срабатывания и проверьте, пуст ли список.
Как проверить cron-выражение из 6 или 7 полей?
Стандартный POSIX cron использует 5 полей. Quartz Scheduler добавляет поле секунд в начало (6 полей) и опциональное поле года в конец (7 полей). AWS EventBridge использует 6 полей. Данный валидатор проверяет стандартный пятипольный формат. Для проверки выражений Quartz или EventBridge используйте библиотеку с поддержкой расширенного формата — например, cron-parser с опцией extended в Node.js или quartz-cron в Java.
Можно ли использовать именованные дни и месяцы в cron-выражениях?
Большинство реализаций cron принимают трёхбуквенные английские сокращения для месяцев (JAN-DEC) и дней недели (SUN-SAT). В crontab они нечувствительны к регистру, но в других системах может быть иначе. Именованные значения поддерживаются в диапазонах не на всех платформах: MON-FRI работает в crontab, но не во всех библиотеках. Если важна переносимость — используйте числовые значения (1-5 для понедельника по пятницу).
Почему cron-выражение работает в crontab, но не в Kubernetes?
Kubernetes CronJobs используют тот же пятипольный формат, что и crontab, но разбираются библиотекой cron на Go, которая применяет более строгую валидацию. Выражения, которые crontab допускает (например, конечные пробелы или одновременно заданные ненулевые поля дня месяца и дня недели), могут вести себя по-другому. Kubernetes также использует часовой пояс controller-manager (обычно UTC), а не локальный часовой пояс узла. Всегда проверяйте выражение применительно к конкретному планировщику, в котором планируете его использовать.
Как нужно проверять cron-выражения в CI/CD-пайплайне?
Добавьте шаг валидации, который выполняется до деплоя. В Node.js-проекте используйте cron-parser или cron-validator в тестовом файле, который читает cron-строки из конфига и проверяет, что они разбираются без ошибок. В Python используйте croniter.is_valid(). В shell-скрипте вызовите функцию валидации и завершайте с ненулевым кодом при ошибке. Это перехватит опечатки и ошибки копирования до попадания в production.
В чём разница между валидацией и линтингом cron?
Валидация проверяет синтаксическую корректность выражения: верное количество полей, значения в диапазоне, допустимые операторы. Линтинг идёт дальше и ищет вероятные ошибки среди технически верных выражений: расписания, которые никогда не срабатывают (31 февраля), пересекающиеся задания, шаговые значения, пропускающие ожидаемые интервалы (*/7 сбрасывается каждый час), или расписания без документирования часового пояса. Валидация отвечает на вопрос «будет ли это разобрано?». Линтинг отвечает на вопрос «это именно то, что вы имели в виду?»