Cron Expression Parser

Разбирайте cron-выражения в читаемые описания и просматривайте ближайшие времена запуска

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

Cron-выражение

minute hour day(month) month day(week)

Читаемое описание

At 9:00 AM, Mon, Tue, Wed, Thu, Fri

Разбивка по полям

Minute

0

0–59

Hour

9

0–23

Day (month)

*

1–31

Month

*

1–12

Day (week)

1-5

0–6

Следующие 10 запланированных запусков

12026-03-26 09:00:00
22026-03-27 09:00:00
32026-03-30 09:00:00
42026-03-31 09:00:00
52026-04-01 09:00:00
62026-04-02 09:00:00
72026-04-03 09:00:00
82026-04-06 09:00:00
92026-04-07 09:00:00
102026-04-08 09:00:00

Что такое разбор cron-выражений?

Cron-выражение — это строка из пяти полей, разделённых пробелами, которая задаёт повторяющееся расписание. Формат возник в демоне Unix cron, впервые написанном Кеном Томпсоном для Unix версии 7 в 1979 году. Каждое поле представляет единицу времени: минуту, час, день месяца, месяц и день недели. Разбор cron-выражения означает преобразование этой компактной записи в читаемое описание и конкретный список ближайших времён выполнения.

Стандартный пятипольный формат используется в crontab на Linux и macOS, платформами CI/CD — GitHub Actions и GitLab CI, облачными планировщиками AWS (EventBridge), Google Cloud Scheduler и Azure Functions, а также библиотеками планирования задач во всех основных языках программирования. Некоторые системы расширяют формат до шести или семи полей, добавляя поле секунд или поле года, однако пятипольная схема, определённая POSIX, остаётся базовой, которую поддерживают все реализации.

Разбирать cron-выражения вручную — дело ненадёжное. Взаимодействие между полями создаёт неочевидные расписания: 0 9 1-7 * 1 означает не «каждый понедельник первой недели», а «с 1-го по 7-е число каждого месяца ИЛИ любой понедельник». Парсер cron устраняет эту неоднозначность, раскрывая каждое поле, применяя правила комбинирования и генерируя фактические метки времени запуска задачи.

Зачем использовать этот парсер cron?

Прочитать cron-выражение вида 30 */6 1,15 * * из конфигурационного файла и точно понять, когда оно сработает, требует мысленных вычислений по пяти полям. Этот парсер выполняет такую работу мгновенно.

Мгновенный разбор
Введите или вставьте cron-выражение и сразу увидите читаемое описание и следующие 10 запланированных запусков. Без кнопки «Отправить», без перезагрузки страницы.
🔒
Обработка без передачи данных
Весь разбор происходит локально в вашем браузере. Ваши cron-выражения и данные расписания никогда не покидают устройство.
📋
Разбивка по каждому полю
Каждое из пяти полей разбирается и отображается отдельно с указанием разрешённых значений. С первого взгляда видно, какое поле управляет расписанием.
🔄
Без регистрации
Откройте страницу и начните разбирать выражения. Никакого входа в систему, API-ключа или установки. Работает на любом устройстве с современным браузером.

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

Frontend-разработчик
Проверяйте cron-выражения в административных панелях и интерфейсах планирования перед отправкой на бэкенд. Убедитесь, что расписание, выбранное пользователем в выпадающем списке, соответствует cron-строке, сгенерированной формой.
Backend-инженер
Отлаживайте запланированные задачи, которые срабатывают в неожиданное время. Вставьте cron-выражение из конфигурации очереди задач (Celery, Sidekiq, Quartz) и проверьте, совпадают ли ближайшие времена запуска с ожидаемыми.
DevOps / SRE
Проводите аудит расписаний cron в CI/CD-пайплайнах, Kubernetes CronJobs и конфигурациях облачных планировщиков. Убедитесь, что резервное копирование, обновление сертификатов и скрипты очистки запланированы корректно — до развёртывания.
QA-инженер
Убедитесь, что запланированные задачи в тестовой среде соответствуют производственному расписанию. Обнаруживайте ошибки на единицу в полях месяца или дня недели до того, как они приведут к пропуску запусков в продакшне.
Инженер по данным
Проверяйте cron-триггеры для ETL-пайплайнов и задач синхронизации данных. Убедитесь, что окна извлечения не пересекаются и что зависимые процессы имеют достаточный запас времени.
Студент / Новичок
Изучайте синтаксис cron, экспериментируя с различными выражениями и наблюдая результаты в реальном времени. Вырабатывайте интуицию в понимании того, как взаимодействуют символы подстановки, диапазоны и шаговые значения.

Справочник по синтаксису cron-выражений

Стандартное cron-выражение состоит из пяти полей, разделённых пробелами. Каждое поле принимает целые числа, символы подстановки, диапазоны, списки и шаговые значения. В таблице ниже показаны допустимый диапазон и операторы для каждого поля.

ПолеДиапазонОператорыОписание
Minute0–59* , - /Minute within the hour
Hour0–23* , - /Hour of the day (24-hour)
Day (month)1–31* , - /Day of the month
Month1–12* , - /Month of the year (or JAN–DEC)
Day (week)0–6* , - /Day of the week (0 = Sunday, or SUN–SAT)

Четыре специальных символа управляют сопоставлением значений внутри каждого поля:

СимволНазваниеПоведение
*WildcardMatches every possible value in the field. * in the minute field means "every minute."
,ListSeparates individual values. 1,15 in the day field means "the 1st and 15th."
-RangeDefines an inclusive range. 1-5 in the day-of-week field means "Monday through Friday."
/StepDefines an interval. */10 in the minute field means "every 10 minutes." 5/15 means "5, 20, 35, 50."

Ниже приведены распространённые cron-выражения, покрывающие большинство потребностей в планировании:

ВыражениеРасписание
* * * * *Every minute
0 * * * *Every hour (at minute 0)
*/15 * * * *Every 15 minutes
0 9 * * *Every day at 9:00 AM
0 9 * * 1-5Weekdays at 9:00 AM
30 2 * * 0Every Sunday at 2:30 AM
0 0 1 * *First day of every month at midnight
0 0 * * 1Every Monday at midnight
0 0 1 1 *January 1st at midnight (yearly)
0 */6 * * *Every 6 hours
5,35 * * * *At minute 5 and 35 of every hour
0 9-17 * * 1-5Every hour from 9 AM to 5 PM, weekdays

Примеры кода

Как разбирать cron-выражения и вычислять ближайшие времена запуска в популярных языках программирования:

JavaScript (Node.js)
import cronstrue from 'cronstrue';

// Parse cron to human-readable text
cronstrue.toString('0 9 * * 1-5');
// → "At 09:00 AM, Monday through Friday"

cronstrue.toString('*/15 * * * *');
// → "Every 15 minutes"

// Validate with cron-parser and get next run times
import { parseExpression } from 'cron-parser';

const interval = parseExpression('30 2 * * 0');
console.log(interval.next().toISOString());
// → next Sunday at 02:30 UTC

// Iterate over the next 5 runs
for (let i = 0; i < 5; i++) {
  console.log(interval.next().toString());
}
Python
from crontab import CronTab
from croniter import croniter
from datetime import datetime

# Parse and describe a cron expression
cron = CronTab('0 9 * * 1-5')
print(cron.next(default_utc=True))
# → seconds until next run

# Get the next 5 run times with croniter
base = datetime.now()
cron_iter = croniter('0 9 * * 1-5', base)
for _ in range(5):
    print(cron_iter.get_next(datetime))
# → next 5 weekday 09:00 timestamps

# Check if a specific time matches
print(croniter.match('*/15 * * * *', datetime(2026, 3, 25, 10, 30)))
# → True (minute 30 is divisible by 15)
Go
package main

import (
    "fmt"
    "time"
    "github.com/robfig/cron/v3"
)

func main() {
    // Parse a standard 5-field cron expression
    parser := cron.NewParser(cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow)
    schedule, err := parser.Parse("0 9 * * 1-5")
    if err != nil {
        panic(err)
    }

    // Calculate the next 5 run times
    now := time.Now()
    for i := 0; i < 5; i++ {
        now = schedule.Next(now)
        fmt.Println(now)
    }
    // → next 5 weekday 09:00 timestamps
}
Bash (crontab)
# List current user's cron jobs
crontab -l

# Edit cron jobs interactively
crontab -e

# Add a job: run backup.sh every day at 2:30 AM
# (append to crontab via pipe)
(crontab -l 2>/dev/null; echo "30 2 * * * /home/user/backup.sh") | crontab -

# Check syntax with a dry-run parse (requires cronie or busybox)
# The system will reject invalid expressions when saving

# View cron logs on systemd-based Linux
journalctl -u cron --since "1 hour ago"

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

В чём разница между 5-польным и 6-польным cron-выражениями?
Стандартный (POSIX) формат cron содержит 5 полей: минута, час, день месяца, месяц, день недели. Некоторые инструменты, такие как Quartz Scheduler и Spring, добавляют поле секунд в начало, делая его 6-польным. AWS EventBridge использует 6 полей с полем года в конце. Данный парсер поддерживает стандартный 5-польный формат, совместимый с crontab, GitHub Actions, Kubernetes CronJobs и большинством библиотек планирования.
Как cron обрабатывает одновременно день месяца и день недели?
Когда оба поля ограничены (не *), cron использует логику ИЛИ: задача выполняется при истинности любого из условий. Например, 0 9 15 * 1 означает «в 9:00 15-го числа каждого месяца ИЛИ каждый понедельник». Это распространённый источник путаницы. Если оба поля равны *, задача выполняется каждый день.
Какой часовой пояс использует cron?
Традиционный crontab работает в локальном часовом поясе системы. Kubernetes CronJobs по умолчанию используют часовой пояс kube-controller-manager (обычно UTC), но поддерживают опциональное поле .spec.timeZone начиная с Kubernetes 1.25. AWS EventBridge и Google Cloud Scheduler позволяют указывать часовой пояс для каждого расписания. Всегда проверяйте часовой пояс вашего планировщика перед развёртыванием cron-задачи.
Может ли cron запускать задачу каждые 30 секунд?
Стандартный 5-польный cron не поддерживает планирование с интервалом менее минуты. Наименьший интервал — одна минута (*/1 или *). Чтобы запускать что-либо каждые 30 секунд, потребуется либо 6-польный cron с полем секунд (Quartz, Spring), либо скрипт-обёртка с ожиданием 30 секунд и повторным запуском, либо иной механизм планирования — например, таймеры systemd с OnCalendar.
Равнозначны ли 0 и 7 в поле дня недели?
В большинстве реализаций cron и 0, и 7 означают воскресенье. Эта договорённость восходит к оригинальному Unix cron. Однако в некоторых системах (Quartz) 1 обозначает воскресенье, а 7 — субботу. POSIX определяет диапазон как 0–6, где 0 = воскресенье. Если ваш планировщик принимает именованные дни (SUN, MON), используйте их, чтобы избежать неоднозначности.
Что произойдёт, если задать несуществующий день месяца?
Если задача запланирована на 31-е число (0 0 31 * *), она не будет выполняться в месяцах, содержащих менее 31 дня. Cron не переносит запуск на следующий месяц. Февраль всегда будет пропущен, а также апрель, июнь, сентябрь и ноябрь. Для запуска в последний день каждого месяца некоторые реализации cron поддерживают модификатор L (0 0 L * *), но стандартный POSIX cron этого не делает.
Как протестировать cron-выражение до его развёртывания?
Используйте онлайн-парсер, подобный этому, чтобы увидеть ближайшие времена запуска и убедиться, что расписание соответствует замыслу. Для проверки в продакшне большинство библиотек cron предоставляют функцию вычисления следующего запуска: cron-parser в Node.js, croniter в Python, robfig/cron в Go. Прогоните выражение через одну из них в тестовом наборе, чтобы утвердить следующие N времён выполнения до развёртывания.