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-виразу онлайн дозволяє виявити помилки раніше, ніж при розгортанні в продакшені та очікуванні пропущеного завдання. Типові помилки: значення 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) під час перевірки коду. Переконайтеся, що рефакторений рядок розкладу досі проходить валідацію синтаксису.
DevOps / SRE
Валідуйте cron-розклади в маніфестах Kubernetes CronJob і конфігураціях CI/CD-пайплайнів перед їх застосуванням. Запобігайте тому, щоб друкарська помилка в розкладі резервного копіювання залишилася непоміченою до першого пропуску.
QA-інженер
Тестуйте, чи ваш застосунок правильно відхиляє невалідний cron-ввід. Генеруйте свідомо помилкові вирази (значення поза діапазоном, неправильна кількість полів) і перевіряйте, чи обробка помилок працює коректно.
Інженер з даних
Валідуйте cron-тригери для DAG-ів Airflow і запланованих запусків dbt. Перевіряйте, чи розклади пайплайнів, зчитані з файлів конфігурації YAML або JSON, синтаксично коректні перед розгортанням.
Студент / той, хто навчається
Експериментуйте із синтаксисом cron і отримуйте миттєвий зворотний зв'язок про те, що є валідним, а що — ні. Вивчайте діапазони полів, оператори та граничні випадки, тестуючи вирази та читаючи повідомлення про помилки.

Поширені синтаксичні помилки у cron-виразах

У таблиці нижче наведено найчастіші помилки в cron-виразах та їх причини. Це помилки, що регулярно трапляються в конфігураціях продакшену та 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 для стандартного cron), значення поза допустимим діапазоном (наприклад, година 25, хвилина 60, день місяця 0), крок нуль (*/0), обернені межі діапазону (5-1) або нерозпізнані символи. Вираз повинен містити рівно п'ять полів, розділених пробілами, із валідними значеннями та операторами в кожному.
Чи є cron-вираз валідним, якщо він ніколи не спрацьовує?
Так, синтаксично. Вираз на кшталт 0 0 31 2 * (31 лютого) проходить синтаксичну валідацію, оскільки кожне поле містить значення в допустимих діапазонах. Але він ніколи не спрацює, бо в лютому не буває 31 дня. Більшість валідаторів перевіряють лише синтаксис, а не семантичну коректність. Якщо потрібно виявляти недосяжні розклади, обчисліть наступні N часів запуску та перевірте, чи список не порожній.
Як валідувати 6-польовий або 7-польовий cron-вираз?
Стандартний POSIX cron використовує 5 полів. Quartz Scheduler додає поле секунд на початку (6 полів) і необов'язкове поле року в кінці (7 полів). AWS EventBridge використовує 6 полів. Цей валідатор перевіряє стандартний 5-польовий формат. Для валідації виразів 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 використовують той самий 5-польовий формат, що й crontab, але розбір виконується бібліотекою cron на Go, яка має суворішу валідацію. Вирази, які crontab приймає (наприклад, пробіл у кінці або обидва поля — день місяця і день тижня — задані як не-підстановка), можуть поводитися інакше. Kubernetes також за замовчуванням використовує часовий пояс контролера (зазвичай UTC), а не локальний часовий пояс вузла. Завжди валідуйте вираз щодо конкретного планувальника, в якому розгортаєте.
Як валідувати cron-вирази в CI/CD-пайплайні?
Додайте крок валідації, що виконується перед розгортанням. У проекті на Node.js використовуйте cron-parser або cron-validator у тестовому файлі, що зчитує cron-рядки з конфігурації та перевіряє їх розбір без помилок. У Python використовуйте croniter.is_valid(). У shell-скрипті викличте функцію валідації та завершуйте з ненульовим кодом при помилці. Це виявляє друкарські помилки та помилки копіювання до потрапляння в продакшен.
У чому різниця між валідацією та лінтингом cron?
Валідація перевіряє, чи є вираз синтаксично коректним: правильна кількість полів, значення в діапазоні, валідні оператори. Лінтинг іде далі й перевіряє ймовірні помилки, що є технічно валідними: розклади, що ніколи не спрацьовують (31 лютого), завдання, що перекриваються, значення кроку, які пропускають очікувані інтервали (*/7 скидається щогодини), або розклади без документації часового поясу. Валідація відповідає на питання «чи це розбереться?» Лінтинг відповідає на «чи це те, що ви мали на увазі?»