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 daemon, вперше написаного Кеном Томпсоном для Version 7 Unix у 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"