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 запланированных запусков
Что такое разбор 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
Справочник по синтаксису cron-выражений
Стандартное cron-выражение состоит из пяти полей, разделённых пробелами. Каждое поле принимает целые числа, символы подстановки, диапазоны, списки и шаговые значения. В таблице ниже показаны допустимый диапазон и операторы для каждого поля.
| Поле | Диапазон | Операторы | Описание |
|---|---|---|---|
| Minute | 0–59 | * , - / | Minute within the hour |
| Hour | 0–23 | * , - / | Hour of the day (24-hour) |
| Day (month) | 1–31 | * , - / | Day of the month |
| Month | 1–12 | * , - / | Month of the year (or JAN–DEC) |
| Day (week) | 0–6 | * , - / | Day of the week (0 = Sunday, or SUN–SAT) |
Четыре специальных символа управляют сопоставлением значений внутри каждого поля:
| Символ | Название | Поведение |
|---|---|---|
| * | Wildcard | Matches every possible value in the field. * in the minute field means "every minute." |
| , | List | Separates individual values. 1,15 in the day field means "the 1st and 15th." |
| - | Range | Defines an inclusive range. 1-5 in the day-of-week field means "Monday through Friday." |
| / | Step | Defines 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-5 | Weekdays at 9:00 AM |
| 30 2 * * 0 | Every Sunday at 2:30 AM |
| 0 0 1 * * | First day of every month at midnight |
| 0 0 * * 1 | Every 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-5 | Every hour from 9 AM to 5 PM, weekdays |
Примеры кода
Как разбирать cron-выражения и вычислять ближайшие времена запуска в популярных языках программирования:
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());
}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)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
}# 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"