Skip to content

Генератор crontab и конструктор cron-выражений

Создавайте, проверяйте и расшифровывайте cron-выражения в браузере. Предпросмотр запусков в локальном времени или UTC. POSIX 5 полей, пресеты, описание простым языком. Бесплатно и приватно.

Без отслеживания Работает в браузере Бесплатно
Весь разбор и расчёт ближайших запусков выполняются локально в вашем браузере. Никакие данные не передаются на сервер.

Поля
Пресеты

На естественном языке

Ближайшие 5 запусков

Часовой пояс для предпросмотра запусков
    Проверено на соответствие POSIX из 5 полей, корректность семантики OR, привязку оператора шага, раскрытие именованных токенов и отклонение операторов Quartz с понятными ошибками — Команда инженеров Go Tools · May 20, 2026

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

    Cron-выражение — это строка из пяти полей, определяющая повторяющееся расписание. Слева направо поля идут так: минута (0-59), час (0-23), день месяца (1-31), месяц (1-12) и день недели (0-6, где 0 и 7 оба означают воскресенье). Каждое поле принимает значение, список (`1,3,5`), диапазон (`1-5`), подстановочный знак (`*` — любое значение) или шаг (`*/15` — каждые 15). Сочетание полей точно определяет, когда сработает запланированная команда — например, `0 9 * * 1-5` читается так: «в минуту 0, в час 9, любой день месяца, любой месяц, день недели с понедельника по пятницу», а на простом языке — «по будням в 9:00».

    Cron появился в Unix Version 7 в 1979 году, и пятипольная грамматика осталась практически неизменной более четырёх десятилетий — это свидетельство того, насколько удачно был спроектирован исходный синтаксис. Сегодня cron-выражения используются далеко за пределами файла Unix crontab: Kubernetes CronJobs, workflow-файлы GitHub Actions, правила AWS EventBridge, запланированные пайплайны GitLab CI, Cloudflare Workers Cron Triggers и serverless-платформы во всех облаках принимают одну и ту же грамматику из пяти полей. Один раз освоить cron — значит уметь планировать задачи в любой современной инфраструктуре.

    Стандарт POSIX определяет пять операторов: `*` (любое значение), `,` (список значений), `-` (диапазон), `/` (шаг) и именованные токены для месяцев (JAN-DEC) и дней недели (SUN-SAT). Большинство реализаций также раскрывают пять распространённых сокращений: `@yearly` (`0 0 1 1 *`), `@monthly` (`0 0 1 * *`), `@weekly` (`0 0 * * 0`), `@daily` (`0 0 * * *`) и `@hourly` (`0 * * * *`). Планировщик Quartz (Java-библиотека) расширяет это опциональным полем секунд и дополнительными операторами (`?`, `L`, `W`, `#`) — полезно при работе с Java/Spring, но не переносимо в стандартный cron. Этот инструмент следует пятипольному стандарту POSIX, потому что это доминирующий вариант — именно его понимают ваш Linux-сервер, раннер GitHub Actions и кластер Kubernetes.

    Одна особенность POSIX cron заслуживает отдельного внимания: когда оба поля — день месяца и день недели — ограничены (ни одно не равно `*`), расписание срабатывает, если совпадает ХОТЯ БЫ ОДНО условие — семантика OR, а не AND. Поэтому `0 0 1 * 5` запускается 1-го числа каждого месяца И каждую пятницу, а не только в пятницы, выпадающие на 1-е число. Это самый частый сюрприз cron; предпросмотр ближайших запусков в этом инструменте делает его очевидным, показывая реальные даты и время срабатывания расписания. Проверяйте перед деплоем.

    Весь разбор и расчёт ближайших запусков выполняются полностью в браузере на JavaScript — никакие выражения, расписания или другие данные никогда не отправляются на сервер. Этот инструмент мгновенно разбирает любое стандартное POSIX cron-выражение с описанием на естественном языке и предпросмотром пяти запусков, с полной приватностью.

    Cron-выражения тесно связаны с другими инструментами для разработчиков. Cron-задачи часто отлаживают, сверяя Unix timestamps с ожидаемым временем запуска, а сложные расписания нередко документируют как JSON-конфигурацию, которую можно проверить нашим форматировщиком JSON. Подробное руководство, охватывающее семантику OR, ловушки часовых поясов и распространённые варианты cron с примерами для Linux, Kubernetes и GitHub Actions, читайте в нашем справочнике по cron-расписаниям.

    # Linux crontab entry — runs every 15 minutes
    */15 * * * *  /usr/local/bin/poll-api.sh
    
    # Kubernetes CronJob — weekdays at 9:00 AM UTC
    apiVersion: batch/v1
    kind: CronJob
    metadata:
      name: daily-report
    spec:
      schedule: "0 9 * * 1-5"
      timeZone: "UTC"
      jobTemplate:
        spec:
          template:
            spec:
              containers:
                - name: report
                  image: report-runner:1.0
              restartPolicy: OnFailure
    
    # GitHub Actions workflow — hourly
    on:
      schedule:
        - cron: '0 * * * *'
    
    # AWS EventBridge — first of each month
    ScheduleExpression: cron(0 0 1 * ? *)
    # (Note: AWS uses the Quartz 6-field form with '?' for day-of-week)

    Ключевые возможности

    Живой парсер POSIX из 5 полей

    Строгий парсер по POSIX cron: минута (0-59), час (0-23), день месяца (1-31), месяц (1-12 или JAN-DEC), день недели (0-6 или SUN-SAT, при этом 7 тоже принимается как воскресенье). Поддерживаются все стандартные операторы (`*` `,` `-` `/`) и макросы (`@yearly` `@monthly` `@weekly` `@daily` `@hourly`).

    Предпросмотр ближайших 5 запусков

    Рассчитывает ближайшие пять моментов запуска от вашего текущего локального времени. Переключение между Local и UTC одним кликом — самый надёжный способ поймать сюрпризы с часовым поясом до того, как crontab уедет на сервер в другом регионе.

    Описание на естественном языке

    Каждое корректное выражение получает человекочитаемое объяснение: «Каждые 15 минут», «По будням в 9:00», «В 02:30 1-го числа в январе и июле». Делает код-ревью и передачу задач между членами команды простой — больше не нужно гадать, что на самом деле делает `*/5 9-17 * * 1-5`.

    Сообщения об ошибках на уровне поля

    Некорректные выражения мгновенно получают красную обратную связь с подсветкой проблемного поля и конкретной ошибкой: «Ошибка в поле минута: значение вне диапазона [0, 59]: "60"». Никаких больше тихих сбоев crontab, обнаруженных через три дня, когда отчёт так и не запустился.

    Пресеты для распространённых расписаний

    Одиннадцать пресетов в один клик покрывают расписания, которые действительно понадобятся: каждую минуту, каждые 5/15 минут, каждый час, ежедневно в полночь или в 9:00, по будням в 9:00, еженедельно по воскресеньям/понедельникам, 1-го числа каждого месяца и ежегодно. Выбрать, подстроить, отправить.

    Поля-конструктор для каждой позиции

    Не нужно запоминать порядок пяти полей — пять небольших полей с подписями «Минута», «Час», «День месяца», «Месяц», «День недели» позволяют редактировать по одной позиции за раз без потери значения и без перепутанного порядка. Полное выражение наверху пересобирается автоматически.

    Семантика POSIX OR — как положено

    Когда оба поля — день месяца и день недели — ограничены, срабатывает правило OR: `0 0 1 * 5` запускается каждое 1-е число И каждую пятницу. Предпросмотр ближайших запусков делает это видимым до деплоя — никаких больше неожиданных вызовов в выходные.

    100% приватность в браузере

    Cron-выражения — которые часто раскрывают временные характеристики инфраструктуры и внутренние паттерны планирования — никогда не покидают браузер. Никакие данные не передаются на сервер, без логирования, без аналитики. Это можно проверить во вкладке Network в браузере. Безопасно для рабочих расписаний и внутренних систем.

    Сообщения об ошибках с учётом Quartz

    Если вставить выражение Quartz с `?`, `L`, `W` или `#`, парсер объяснит «Quartz operators not supported — use POSIX syntax», чтобы было понятно: нужно переписать под cron, а не отлаживать тихий сбой. Расписания Quartz не работают в Linux cron.

    Варианты cron и планировщики

    Vixie cron (стандарт Linux)

    POSIX из 5 полей

    Стандарт в большинстве дистрибутивов Linux. Строгий POSIX с расширением `CRON_TZ=` для явного часового пояса. Действует семантика OR между днём месяца и днём недели. Основная цель этого инструмента.

    BSD cron

    POSIX из 5 полей

    Стандарт в macOS и BSD-семействе. POSIX-совместим, с небольшими отличиями реализации от vixie cron; большинство выражений работают одинаково.

    systemd-таймеры (OnCalendar)

    calendar spec, не cron

    Альтернатива cron в Linux на базе systemd. Использует синтаксис `OnCalendar: 2026-*-* 09:00:00` — более читаемый для неповторяющихся расписаний, но не совместим с cron-выражениями.

    Quartz Scheduler (Java/Spring)

    6 или 7 полей

    Добавляет поле секунд (обязательное) и поле года (опциональное), плюс операторы `?`, `L`, `W`, `#`. Полезен для Java-приложений, но не переносим в Linux cron.

    AWS EventBridge

    6 полей в стиле Quartz с `?`

    Требует, чтобы день недели или день месяца был `?` (по соглашению Quartz), а не `*`, когда ограничено только одно поле. Выражения не переносятся напрямую в Linux cron.

    Kubernetes CronJob

    POSIX из 5 полей + поле timeZone

    POSIX-расписание из 5 полей плюс поле `spec.timeZone` (1.27+). Чище, чем полагаться на часовой пояс хоста kubelet. Выражения переносятся напрямую из Linux cron.

    GitHub Actions

    POSIX из 5 полей

    Всегда работает в UTC. Тайминг best-effort — может пропускаться при высокой нагрузке. Избегайте интервалов короче 15 минут. Выражения переносятся напрямую из Linux cron.

    Примеры cron-выражений

    Каждые 15 минут

    */15 * * * *

    Оператор шага: `*/15` в поле минут означает «каждые 15 минут начиная с минуты 0» — запуски в :00, :15, :30, :45 каждый час каждого дня. Самый распространённый интервал для опроса API, обновления кэшей и проверок доступности.

    По будням в 9:00

    0 9 * * 1-5

    Диапазон `1-5` в поле дня недели означает с понедельника по пятницу (1=Пн, 5=Пт). Запуск ровно в 09:00 — удобно для отчётов в рабочее время, пакетных задач, зависящих от ночных данных, и напоминаний о ежедневных стендапах.

    1-го числа каждого месяца в полночь

    0 0 1 * *

    День месяца `1`, все младшие поля — ноль. Часто используется для ежемесячного биллинга, ротации логов и сверок по итогам периода. День месяца и день недели считаются ограниченными только когда ни один из них не равен `*`; здесь день недели равен `*`, поэтому важен только день месяца.

    Каждые 5 минут с 9:00 до 17:00 по будням

    */5 9-17 * * 1-5

    Комбинирует шаг (`*/5`) с диапазоном (`9-17`) в разных полях. Полезно для мониторинга только в рабочие часы или разгрузки очередей. Итого: 12 запусков/час × 9 часов × 5 дней = 540 запусков за рабочую неделю.

    Поквартально: 1-го января, апреля, июля и октября в полночь

    0 0 1 JAN,APR,JUL,OCT *

    Именованные месяцы через запятую. Квартальные расписания — финансовое закрытие, ревью code-freeze, аудит на соответствие требованиям. Можно смешивать имена и числа (`1,APR,7,10` разбирается так же), но для читаемости лучше придерживаться одного стиля.

    Подводный камень POSIX OR: 1-е число месяца ИЛИ каждая пятница

    0 0 1 * 5

    Когда ОБА поля — день месяца (`1`) И день недели (`5`) — ограничены, POSIX cron запускает задание, если совпадает ХОТЯ БЫ ОДНО условие. Поэтому выражение срабатывает 1-го числа каждого месяца И каждую пятницу, а не только в пятницы, выпадающие на 1-е число. Это самый частый сюрприз cron; предпросмотр ближайших запусков делает его очевидным.

    Каждый день в 02:30 (окно низкой нагрузки)

    30 2 * * *

    Конкретные значения для часа и минуты, подстановочные знаки в остальных полях. Окно 02:00-04:00 UTC де-факто стало стандартом для ночных пакетных задач, потому что не пересекается с рабочими часами ни одного крупного бизнес-региона. Сочетайте с переключением на UTC, чтобы убедиться, что запуск попадает туда, куда нужно.

    Макроэквивалент: @daily

    @daily

    Сокращение `@daily` (а также `@midnight`) раскрывается в `0 0 * * *` — ежедневно в полночь. Остальные макросы: `@yearly` = `0 0 1 1 *`, `@monthly` = `0 0 1 * *`, `@weekly` = `0 0 * * 0`, `@hourly` = `0 * * * *`. Макросы лаконичны, но пятипольная форма более переносима между планировщиками (одни поддерживают макросы, другие нет).

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

    1. 1

      Введите или вставьте cron-выражение

      Введите пятипольное cron-выражение в поле выше (например, `*/15 * * * *`). Инструмент разбирает и проверяет ввод на лету — зелёная галочка при корректном вводе, красная ошибка с названием поля при некорректном. Макросы вроде `@daily`, `@hourly` и других тоже принимаются.

    2. 2

      Или подкрутите пять отдельных полей

      Не нужно запоминать порядок полей — редактируйте Минуту, Час, День месяца, Месяц или День недели по отдельности через подписанные поля. Полное выражение наверху обновляется автоматически. Используйте `*` для подстановочных знаков, `*/N` для шагов, `a-b` для диапазонов и `1,3,5` для списков.

    3. 3

      Выберите пресет для быстрого старта

      Нажмите любой пресет (каждые 15 минут, по будням в 9:00 и т.д.), чтобы загрузить распространённое расписание, а затем подстройте поля под конкретную задачу. Одиннадцать пресетов покрывают паттерны, которые действительно встречаются в продакшене.

    4. 4

      Проверьте предпросмотр ближайших запусков

      Посмотрите на пять предстоящих дат и времён запуска — переключайтесь между Local и UTC, чтобы убедиться, что расписание срабатывает в нужный момент. Это самый надёжный способ поймать ловушку POSIX OR между днём месяца и днём недели до того, как она ударит в продакшене.

    5. 5

      Скопируйте и вставьте в планировщик

      Нажмите Copy, чтобы скопировать выражение. Вставьте в crontab, systemd-таймер, `cron:` в GitHub Actions, AWS EventBridge, `schedule` в Kubernetes CronJob или в любой совместимый с cron планировщик. Не забудьте проверить часовой пояс целевого планировщика — см. раздел «Лучшие практики» ниже.

    Частые ошибки cron

    Ловушка POSIX OR: оба поля дней ограничены

    Когда ОБА поля — день месяца и день недели — ограничены, POSIX cron запускает задание, если совпадает ХОТЯ БЫ ОДНО условие, а не оба сразу. Поэтому `0 0 1 * 5` срабатывает 1-го числа каждого месяца И каждую пятницу, а не только в пятницы, выпадающие на 1-е. Поставьте `*` в одно из двух полей дней, когда нужно одно условие, или напишите скрипт-обёртку, делающий проверку AND.

    ✗ Неверно
    # Задумано: «первая пятница месяца»
    0 0 1-7 * 5
    # На самом деле: срабатывает 1-7 числа месяца ИЛИ каждую пятницу — оба условия
    ✓ Верно
    # Обёртка для настоящей семантики AND
    0 0 * * 5  [ $(date +\%d) -le 7 ] && /your-script
    # ИЛИ откажитесь от одного условия и примите более широкое расписание

    Дрейф часового пояса между dev и prod

    Cron-расписания на Linux-сервере используют системный часовой пояс, а не локальный пояс автора. 9:00 cron на сервере с UTC сработает в 4:00 утра по US East. Всегда проектируйте расписания относительно часового пояса целевого сервера — желательно UTC — и явно фиксируйте часовой пояс через `CRON_TZ=...` в начале crontab.

    ✗ Неверно
    # Написано разработчиком в US East, развёрнуто на сервер с UTC
    0 9 * * *  /your-report.sh
    # Сработает в 9:00 UTC = 4:00 утра по US East — не то, что задумал разработчик
    ✓ Верно
    # Зафиксируйте часовой пояс или пишите явно в UTC
    CRON_TZ=America/New_York
    0 9 * * *  /your-report.sh

    Путаница с оператором шага: '*/15' vs '15'

    `*/15` в минутах означает «каждые 15 минут начиная с 0» (то есть 0, 15, 30, 45). Просто `15` означает «только в минуту 15» — один запуск в час. Новички часто пишут `15`, думая, что это каждые 15 минут; описание на естественном языке в инструменте делает ошибку очевидной до деплоя.

    ✗ Неверно
    # Задумано: каждые 15 минут
    15 * * * *
    # На самом деле: раз в час, в минуту 15 (на 4 запуска/час меньше, чем задумано)
    ✓ Верно
    # Правильно
    */15 * * * *
    # Каждые 15 минут: минуты 0, 15, 30, 45 каждого часа

    Шестипольное выражение на POSIX-планировщике

    Quartz/Spring/node-cron поддерживают опциональное поле секунд первым. Linux crontab, GitHub Actions, AWS EventBridge (в основном) и Kubernetes CronJob — НЕ поддерживают; они ожидают пять полей. Вставка шестипольного выражения молча ломает расписание: секунды становятся минутами, минуты — часами и так далее.

    ✗ Неверно
    # Quartz из 6 полей скопирован в Linux crontab
    0 0 9 * * 1-5
    # Linux читает: минута=0, час=0, день месяца=9, месяц=*, день недели=1-5
    # = полночь 9-го числа в месяцах, совпадающих с буднями — хаос
    ✓ Верно
    # POSIX из 5 полей, убираем секунды
    0 9 * * 1-5
    # = по будням в 9:00

    День месяца вне диапазона для этого месяца

    Cron не сверяет день месяца с реальным месяцем. `0 0 31 2 *` (31 февраля) парсится нормально, но никогда не совпадёт — в феврале максимум 29 дней. Новички полагают, что парсер это поймает; он не ловит. Предпросмотр ближайших запусков показывает «Нет ближайших запусков», когда выражение структурно корректно, но логически невозможно.

    ✗ Неверно
    # 30 или 31 февраля — никогда не запустится
    0 0 30 2 *
    0 0 31 2 *
    # Парсится, но расписание не сработает никогда
    ✓ Верно
    # Используйте паттерн «последний рабочий день февраля» через скрипт
    0 0 28-29 2 *  [ $(date -d tomorrow +\%m) = 03 ] && /your-script

    Перепутали синтаксис Quartz и POSIX

    Документация AWS, туториалы по Spring и многие ответы на Stack Overflow показывают cron-выражения Quartz с `?`, `L`, `W` или `#`. Они не работают в Linux crontab. Если скопировать шестипольное выражение с `?` в позиции дня недели, Linux-парсер либо его отклонит, либо, что хуже, молча неправильно разберёт. Этот инструмент ловит операторы Quartz и объясняет разницу.

    ✗ Неверно
    # Quartz: «последняя пятница месяца» — невалидно в POSIX
    0 0 ? * 6L *
    ✓ Верно
    # Подход с обёрткой POSIX для последней пятницы
    0 0 25-31 * 5  /your-script
    # Запуск в пятницу между 25-31 числом любого месяца

    Типичные сценарии

    Задачи в Linux crontab
    Создавайте и проверяйте записи для `/etc/crontab`, `/etc/cron.d/*` или пользовательских файлов `crontab -e`. Используйте предпросмотр ближайших запусков, чтобы убедиться, что расписание попадает в нужное время в часовом поясе сервера, до сохранения.
    Расписания Kubernetes CronJob
    Сгенерируйте поле `spec.schedule` для Kubernetes CronJob. Kubernetes 1.27+ также поддерживает `spec.timeZone` — используйте переключатель UTC, чтобы спроектировать расписание в UTC, а затем явно задайте `timeZone`, чтобы не зависеть от локального времени рабочего узла.
    Запланированные workflow GitHub Actions
    Создайте запись `cron:` под `on.schedule`. GitHub Actions всегда работает в UTC — переключите предпросмотр на UTC, чтобы убедиться в расписании. Избегайте интервалов короче 15 минут; планировщик GitHub пропускает короткие интервалы при высокой нагрузке.
    Правила AWS EventBridge
    Соберите cron-выражение для запланированного правила EventBridge. Учтите: AWS использует шестипольный синтаксис в стиле Quartz с `?` для дня недели — этот инструмент выдаёт пятипольный POSIX, который нужно сконвертировать, добавив секунды (`0`) и заменив `*` в одном из полей дня на `?`.
    Запланированные пайплайны GitLab CI
    Проверяйте cron-выражение для запланированного CI-пайплайна в GitLab. GitLab использует пятипольный синтаксис POSIX — именно то, что выдаёт этот инструмент, — и UI-выбор даты, но cron-форма даёт более тонкий контроль для нестандартных интервалов.
    Cloudflare Workers Cron Triggers
    Создайте запись `[triggers.crons]` в `wrangler.toml`. Cloudflare использует пятипольный синтаксис POSIX. Минимальный интервал — одна минута; воркер работает в UTC. Используйте предпросмотр, чтобы убедиться, что триггер срабатывает в ожидаемом окне.
    Расписания Node.js node-cron
    Создавайте выражения для библиотеки `node-cron`, которая поддерживает как пятипольный POSIX, так и опциональное ведущее поле секунд. Придерживайтесь пяти полей, если конкретно не нужна точность меньше минуты — шестипольные выражения не переносятся в Linux crontab.
    Код-ревью и документация
    Вставьте cron-выражение из PR или runbook, чтобы мгновенно увидеть, что оно делает — больше не нужно гадать над `30 7 * * 1-5` или доставать справочную карту. Описание на естественном языке также отлично подходит для inline-комментариев и README.

    Справочник по синтаксису cron

    Порядок полей: М Ч Д М Н
    Минута (0-59), Час (0-23), День месяца (1-31), Месяц (1-12), День недели (0-6, при этом 7 тоже = воскресенье). Поле дня недели принимает и числа (0-6), и имена (SUN-SAT, без учёта регистра).
    Операторы
    `*` = любое значение; `,` = разделитель списка (`1,3,5`); `-` = диапазон (`1-5`); `/` = шаг (`*/15`, `5/10`); имена: JAN-DEC для месяца, SUN-SAT для дня недели (без учёта регистра).
    Макросы (псевдонимы)
    `@yearly` = `0 0 1 1 *`; `@annually` = `0 0 1 1 *`; `@monthly` = `0 0 1 * *`; `@weekly` = `0 0 * * 0`; `@daily` = `0 0 * * *`; `@midnight` = `0 0 * * *`; `@hourly` = `0 * * * *`. `@reboot` — особый случай (запуск только при загрузке), а не расписание; он отклоняется с пояснительной ошибкой.
    Семантика POSIX для дней (правило OR)
    Когда ОБА поля — день месяца и день недели — ограничены (ни одно не равно `*`), расписание срабатывает, если совпадает ХОТЯ БЫ ОДНО условие — семантика OR. Когда ограничено только одно, оно и решает. Когда оба равны `*`, подходит любой день. Правило OR работает в vixie cron, BSD cron и большинстве POSIX-реализаций; Quartz использует `?`, чтобы разводить AND и OR.
    Шестипольный режим (Quartz-Lite)
    Если ввод содержит шесть токенов через пробел, инструмент трактует первый как поле секунд (0-59). Полезно для Quartz, Spring `@Scheduled(cron=...)` и node-cron. НЕ переносимо в Linux crontab и POSIX-планировщики — они воспримут секунды как минуты и сдвинут всё на одну позицию.
    Привязка оператора шага
    `*/N` привязан к наименьшему значению поля: `*/15` в минуте = `0,15,30,45`, а не «каждые 15 начиная с сейчас». С базой, отличной от подстановочного знака: `5/15` в минуте = `5,20,35,50`. Шаги, не делящие диапазон поля нацело, пропускают значения у границы — это корректно, а не баг.
    Границы валидации
    минута ∈ [0,59], час ∈ [0,23], день месяца ∈ [1,31], месяц ∈ [1,12], день недели ∈ [0,7]. Значения вне диапазона дают ошибку на уровне поля. День месяца НЕ сверяется с месяцем (`0 0 31 2 *` парсится нормально, но никогда не совпадёт, поскольку в феврале нет 31-го дня — предпросмотр покажет «Нет ближайших запусков»).
    Операторы Quartz отклоняются
    POSIX cron не поддерживает Quartz-операторы `?` (без конкретного значения), `L` (last), `W` (ближайший рабочий день) и `#` (n-й день недели). Этот инструмент отклоняет их с понятным сообщением «Quartz operators not supported», а не молча трактует как невалидный POSIX. Для расписаний Quartz используйте инструмент с поддержкой Quartz или планировщик Spring.
    Ограничение поиска ближайших запусков по годам
    Поиск ближайших запусков ведётся максимум на 4 года вперёд; выражения, совпадающие реже (например, паттерны «29 февраля»), покажут «Нет ближайших запусков в течение 4 лет». Это сделано намеренно, чтобы избежать бесконечной итерации для невозможных паттернов.

    Лучшие практики для cron-расписаний

    Используйте UTC на серверах, конвертируйте при отображении
    Настройте серверы на UTC (`/etc/timezone` или `TZ=UTC`) и пишите все cron-выражения в UTC. Конвертируйте в локальное время только при отображении в дашбордах и отчётах. Это исключает целый класс багов с часовыми поясами, особенно болезненных при переходах на летнее время, когда расписания в локальном времени тихо дублируются или пропускают запуск. Используйте переключатель UTC в этом инструменте, чтобы проектировать расписание в UTC с самого начала.
    Избегайте ловушки POSIX OR между днём месяца и днём недели
    Никогда не ограничивайте одновременно день месяца И день недели, если только не нужна семантика OR. Если нужен «каждый понедельник в январе», пишите `0 0 * 1 1` (день месяца — `*`); если нужно «1-е число каждого месяца», пишите `0 0 1 * *` (день недели — `*`). Правило POSIX OR означает, что `0 0 1 * 1` сработает 1-го числа И каждый понедельник — почти наверняка не то, что задумано. Предпросмотр ближайших запусков поймает это, если проверять перед деплоем.
    Явно фиксируйте часовой пояс расписания
    Современные планировщики поддерживают фиксацию часового пояса в определении расписания: `CRON_TZ=America/New_York` в начале crontab (vixie cron 3.0+), `spec.timeZone: "America/New_York"` для Kubernetes CronJobs 1.27+, выражение расписания с `ScheduleExpressionTimezone` для AWS EventBridge Scheduler. Фиксируйте часовой пояс явно, а не полагайтесь на настройки сервера — часовые пояса серверов могут меняться без предупреждения во время инфраструктурных миграций.
    Распределяйте нагрузку по минутам, а не на :00
    Избегайте `0 * * * *` (каждый час в минуту 0) для некритичных задач — на большом масштабе планирование множества заданий ровно на :00 создаёт всплески нагрузки. Подбирайте случайное смещение по минутам (`23 * * * *`, `41 * * * *`) для каждой задачи, чтобы распределить нагрузку. То же касается ежедневных задач: `30 3 * * *` дружелюбнее к вашей базе данных, чем `0 3 * * *`, когда множество заданий сходится к 3:00.
    Делайте задания идемпотентными
    У cron нет встроенного повтора, нет предотвращения пересечений, нет восстановления пропущенных запусков. Задание должно быть безопасно для повторного выполнения (идемпотентным) и проверять само себя. Вместо «отправить отчёт в 9:00» проектируйте как «отправить сегодняшний отчёт, если ещё не отправлен» — это самовосстанавливается после простоя, случайных двойных расписаний и параллельных запусков. Идемпотентность — это свойство задания, а не планировщика, и это самая важная практика надёжности.
    Добавляйте heartbeat для критичных расписаний
    Тихий отказ — главное слабое место cron: если расписание не сработало, никто об этом не сообщит. Для критичных задач пусть задание отправляет heartbeat в сервис мониторинга (Healthchecks.io, Cronitor, Dead Man's Snitch) в конце каждого запуска; сервис уведомит, если ожидаемый ping не пришёл. Это ловит и сбой задания, и сбой самого расписания. Бесплатного тарифа хватает большинству личных и малых команд.
    Проверяйте через предпросмотр ближайших запусков перед отправкой
    Перед деплоем нового cron-расписания посмотрите на пять предстоящих дат и времён в предпросмотре этого инструмента. Переключайтесь между Local и UTC. Убедитесь, что расписание попадает туда, куда задумано — не на пять минут раньше, не в неправильный день, не пропуская выходные, которые важны. Предпросмотр — самый дешёвый возможный тест в продакшене.

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

    Что делает этот инструмент?
    Он разбирает, проверяет и объясняет cron-выражения прямо в браузере, показывая живой предпросмотр ближайших пяти запусков в вашем часовом поясе или в UTC. Введите любое стандартное пятипольное cron-выражение POSIX — или соберите его через пресеты и поля без необходимости держать синтаксис в голове — и инструмент выдаст описание на естественном языке («Каждые 15 минут», «По будням в 9:00» и т.д.) плюс точные даты и время, когда задание сработает. Неверные выражения отлавливаются мгновенно с сообщением об ошибке на уровне поля, чтобы не тратить деплой на сломанное расписание. Весь инструмент работает на 100% на стороне клиента: ничего не загружается, не логируется и не сохраняется — безопасно для рабочих crontab и внутренних расписаний с чувствительными временными паттернами.
    Что такое cron-выражение?
    Cron-выражение — это строка из пяти полей, определяющая повторяющееся расписание. Поля: минута (0-59), час (0-23), день месяца (1-31), месяц (1-12) и день недели (0-6, где 0 и 7 оба означают воскресенье). Каждое поле принимает значение, список (`1,3,5`), диапазон (`1-5`), подстановочный знак (`*` = любое) или шаг (`*/15` = каждые 15). Сочетание всех пяти полей точно определяет, когда должна выполняться запланированная команда. Cron появился в Unix V7 (1979) и остаётся де-факто языком планирования задач по времени в Linux/Unix, в оркестрации контейнеров (Kubernetes CronJobs), в CI/CD (GitHub Actions, GitLab CI) и в serverless-платформах (AWS EventBridge, Cloudflare Workers Cron Triggers). За десятилетия предлагалось много альтернатив, но ни одна не вытеснила лаконичную и выразительную грамматику cron из пяти полей.
    Загружаются ли мои данные куда-либо?
    Нет. Весь разбор, валидация и расчёт ближайших запусков выполняются на 100% на стороне клиента в браузере с помощью JavaScript. Выражения никогда не передаются, не сохраняются ни на каком сервере, не логируются и не анализируются. Это делает инструмент безопасным для рабочих crontab, внутренних паттернов планирования, раскрывающих временные характеристики инфраструктуры, и любых чувствительных расписаний. Это можно проверить во вкладке Network в браузере — ввод cron-выражения не вызывает ни одного сетевого запроса. Инструмент не использует cookies для входных данных и не использует сторонней аналитики, которая собирала бы то, что вы вводите.
    В чём разница между POSIX cron и Quartz?
    POSIX cron — это пятипольный стандарт, используемый в Unix/Linux crontab, systemd-таймерах, GitHub Actions, GitLab CI, AWS EventBridge, Kubernetes CronJobs и большинстве планировщиков. Quartz — это Java-библиотека планирования, которая добавляет поле секунд (всего шесть или семь полей) плюс дополнительные операторы: `?` (без конкретного значения — используется, когда день месяца и день недели конфликтуют), `L` (last — последний день месяца, последняя пятница и т.д.), `W` (ближайший рабочий день) и `#` (n-й день недели месяца, например `2#1` = первый вторник). Этот инструмент реализует POSIX cron, поскольку он гораздо шире распространён; операторы Quartz сообщаются как синтаксические ошибки с понятным сообщением «Quartz operators not supported». Если нужен Quartz, ваша цель — популярные Java-планировщики, такие как Quartz Scheduler и Spring `@Scheduled`, но определения расписаний не переносятся напрямую в Linux cron.
    Почему '0 0 1 * 5' запускается каждую пятницу И 1-го числа?
    Это семантика OR между днём месяца и днём недели в POSIX cron, и это самый частый сюрприз cron. Правило: когда ОБА поля ограничены (ни одно не равно `*`), cron запускает задание, если совпадает ХОТЯ БЫ ОДНО условие, а не оба сразу. Поэтому `0 0 1 * 5` (день месяца=1, день недели=5) срабатывает 1-го числа каждого месяца И каждую пятницу, а не только в пятницы, выпавшие на 1-е число. Если нужен только последний вариант (семантика AND — пятница 1-го числа), стандартным cron это выразить нельзя; понадобится скрипт, который запускается каждую пятницу ИЛИ 1-го числа и завершается рано в зависимости от реальной даты. Vixie cron (стандарт в GNU/Linux), BSD cron и AWS EventBridge — все следуют этому правилу OR. Предпросмотр ближайших запусков в этом инструменте делает реальное расписание очевидным — вставляйте подозрительные выражения и проверяйте перед деплоем.
    Как запускать задачу каждые 30 секунд?
    Стандартным POSIX cron — никак. Минимальная гранулярность cron — одна минута, наименьшее поле — минута (0-59). Для расписаний меньше минуты варианты такие: (1) Запустить два задания на `* * * * *` и `* * * * *` с `sleep 30 &&` перед одним из них — грубо, но в vixie cron работает. (2) Использовать планировщик с поддержкой секунд: Quartz, Kubernetes CronJob с собственным контроллером или systemd-таймеры с `OnCalendar: *-*-* *:*:00/30`. (3) Запустить долгоживущий демон, который засыпает на 30 секунд между итерациями — правильный ответ для большинства задач мониторинга. (4) Перейти на событийный триггер (webhook, очередь сообщений), если действительно нужна реакция в реальном времени. Паттерн «cron каждые 30 секунд» почти всегда признак того, что cron — неподходящая абстракция.
    В каком часовом поясе работает cron?
    На Linux-сервере vixie cron использует системный часовой пояс — обычно задаваемый через `/etc/timezone` или переменную окружения `TZ`. Это частый источник багов: 9:00 cron на сервере US East срабатывает в 14:00 UTC, а на сервере с UTC — в 09:00 UTC (то есть в 4:00 утра по US East). Решение — либо всегда выставлять серверам UTC и писать все cron-выражения в UTC, либо устанавливать переменную `CRON_TZ=America/New_York` в начале crontab, чтобы явно зафиксировать часовой пояс (поддерживается в vixie cron 3.0+). Управляемые планировщики ведут себя по-разному: GitHub Actions всегда работает в UTC, AWS EventBridge поддерживает часовой пояс в определении расписания, в Kubernetes CronJob поле `spec.timeZone` появилось в 1.27+. Переключатель UTC/Local в этом инструменте позволяет увидеть расписание в любом часовом поясе — переключайтесь между ними, чтобы убедиться, что запуск произойдёт там, где задумано.
    Во что фактически раскрывается '*/15'?
    Оператор шага `*/N` означает «каждые N начиная с наименьшего допустимого значения поля». Для минут (диапазон 0-59) `*/15` раскрывается в `0,15,30,45` — четыре запуска в час на четвертях часа. Шаг — это НЕ «каждые 15 минут от текущего момента»; он привязан к начальному значению поля. Та же логика для остальных полей: `*/2` в часах = `0,2,4,...,22` (12 запусков); `*/3` в дне месяца = `1,4,7,...,31` (11 запусков). Для шага с базой, отличной от подстановочного знака (например, `5/15`), раскрытие идёт от базы: `5/15` в минутах = `5,20,35,50`. Шаги, не делящие диапазон нацело, пропускают значения у границы — это корректное поведение cron, а не баг. Предпросмотр ближайших запусков делает реальное расписание очевидным.
    Можно ли использовать шестипольное выражение с секундами?
    Шестипольные выражения с ведущим полем секунд (диапазон 0-59) — это расширение Quartz/Spring/Cron4j, а не POSIX. Этот инструмент принимает шестипольные выражения, когда ввод содержит ровно шесть токенов, разделённых пробелами, — полезно, если вы целитесь в Quartz, Spring `@Scheduled(cron=...)` или Node.js-библиотеки вроде `node-cron`, которые поддерживают секунды. Для стандартных POSIX-планировщиков (Linux crontab, GitHub Actions, AWS EventBridge, Kubernetes CronJob) придерживайтесь пяти полей — добавление ведущего поля секунд молча сломает расписание (планировщик примет ваши минуты за секунды, часы за минуты и т.д., сдвинув всё на одну позицию). В сомнительных случаях сверьтесь с документацией целевого планировщика; если в ней явно не сказано «поддерживается шестипольная форма с секундами», используйте пять полей.
    Какой максимальный интервал может выразить cron?
    Без внешнего состояния cron надёжно выражает интервалы до раза в год через `0 0 D M *` (например, `0 0 1 1 *` = каждое 1 января в полночь). Для «раз в два года» или более длинных интервалов одного cron уже недостаточно — потребуется внешняя проверка даты в начале скрипта (например, `[ $(($(date +%Y) % 2)) -eq 0 ] && /your-command` для запуска в чётные годы). Для «каждые 90 дней» и других невыровненных многодневных интервалов cron тоже не справляется: нативного оператора «по модулю дней» нет, поэтому придётся написать обёртку, сверяющую день года с опорной датой. Если потребности в планировании настолько сложны, рассмотрите полноценный планировщик процессов (Airflow, Temporal, AWS Step Functions) — грамматика cron намеренно проста и ломается на всём, что выходит за пределы регулярных недельных или месячных паттернов.
    Как обрабатывать пропущенные запуски после простоя?
    Стандартный cron не восстанавливает пропуски — если система была недоступна в запланированный момент, запуск просто отбрасывается. Записи «мы пропустили этот раз» нет. Для критичных задач есть три варианта: (1) Использовать `anacron` (или `systemd-cron` с `Persistent=true`), который догоняет пропущенные задания после загрузки — подходит для ноутбуков и систем с прерывистой работой. (2) Перейти на планировщик со встроенным повтором: Kubernetes CronJobs имеют `startingDeadlineSeconds` (запуск, если задержка не превышает дедлайн) и `concurrencyPolicy` (предотвращение пересекающихся запусков); AWS EventBridge поддерживает политики повторов. (3) Заложить идемпотентность в само задание: вместо «запустить отчёт в 9:00» пусть задание спрашивает «отчёт за сегодня уже сформирован?» и формирует его, если нет, — это самовосстанавливается после простоя любой длины. Вариант 3 наиболее надёжен и работает с любым планировщиком.
    Почему мой cron в GitHub Actions запускается не вовремя?
    Расписания GitHub Actions работают по принципу best-effort: они могут задерживаться на несколько минут при высокой нагрузке на инфраструктуру GitHub, а при очень высокой нагрузке могут пропускаться полностью (особенно для коротких интервалов вроде каждых пяти минут). То же касается большинства управляемых планировщиков — они жертвуют точностью времени ради масштабируемости и надёжности. Практические выводы: (1) Не планируйте то, что должно запуститься с секундной точностью; cron — это «примерно в это время, ежедневно». (2) Для коротких интервалов предпочтительнее долгоживущий воркер, а не задание по расписанию. (3) Для точных финансовых или регуляторных дедлайнов используйте отдельный cron-демон на сервере под вашим контролем или более строгий планировщик вроде AWS EventBridge Scheduler с расписанием Standard. (4) Конкретно для GitHub Actions: избегайте интервалов короче 15 минут; под нагрузкой планировщик часто их пропускает.

    Похожие инструменты

    Все инструменты →

    Конвертер Unix timestamp и epoch — multi-precision

    Дата и время

    Преобразование Unix timestamp в дату мгновенно. Автоопределение секунд, миллисекунд и микросекунд. Живые часы, двунаправленно. Бесплатно и приватно.

    Конвертер систем счисления — bin, hex, dec, oct

    Конвертеры

    Конвертация между системами счисления — двоичной, hex, десятичной, восьмеричной и любой базой 2-36 мгновенно. Бесплатно, приватно — вся обработка в браузере.

    Base64 декодер и кодировщик

    Кодирование и форматирование

    Декодирование и кодирование Base64 онлайн бесплатно. Преобразование в реальном времени с полной поддержкой UTF-8 и эмодзи. Полная приватность — работает в браузере. Без регистрации.

    Конвертер CSV в JSON

    Кодирование и форматирование

    Конвертируйте CSV в JSON в браузере. RFC 4180, определение типов, заголовок, безопасность больших целых. 100% приватно, без загрузки.

    Сжатие изображений онлайн — JPEG, PNG и WebP

    Конвертеры

    Сжимайте JPEG, PNG и WebP до 80% меньше — в браузере, без загрузки. Batch до 20 изображений, регулировка качества, сравнение «до и после». Бесплатно и приватно.

    JSON Diff и сравнение

    Кодирование и форматирование

    Сравнивайте два JSON-файла мгновенно в браузере. Side-by-side подсветка, вывод JSON Patch (RFC 6902), игнорирование шума вроде timestamp и ID. 100% приватно, без загрузки.