Cron Expression Parser
Analyzujte cron výrazy a zobrazte čitelný popis a příštích 10 naplánovaných spuštění
Cron výraz
minute hour day(month) month day(week)
Čitelný popis
At 9:00 AM, Mon, Tue, Wed, Thu, Fri
Rozpis polí
Minute
0
0–59
Hour
9
0–23
Day (month)
*
1–31
Month
*
1–12
Day (week)
1-5
0–6
Příštích 10 naplánovaných spuštění
Co je parsování cron výrazů?
Cron výraz je řetězec pěti polí oddělených mezerami, který definuje opakující se plán. Formát vznikl v démonu Unix cron, jejž napsal Ken Thompson pro Version 7 Unix v roce 1979. Každé pole představuje časovou jednotku: minutu, hodinu, den v měsíci, měsíc a den v týdnu. Parsování cron výrazu znamená převod tohoto kompaktního zápisu na čitelný popis a konkrétní seznam nadcházejících časů spuštění.
Standardní formát pěti polí používá crontab na Linux a macOS, platformy CI/CD jako GitHub Actions a GitLab CI, cloudové plánovače v AWS (EventBridge), Google Cloud Scheduler a Azure Functions a knihovny pro plánování úloh ve všech hlavních programovacích jazycích. Některé systémy formát rozšiřují na šest nebo sedm polí přidáním pole pro sekundy nebo rok, ale pětipolicové schéma definované standardem POSIX zůstává základem, který sdílejí všechny implementace.
Parsovat cron výrazy ručně je náchylné k chybám. Vzájemné působení polí vytváří neintuitivní plány: výraz 0 9 1-7 * 1 neznamená 'každé pondělí v prvním týdnu', ale 'od 1. do 7. dne každého měsíce NEBO každé pondělí'. Cron parser tuto nejednoznačnost odstraní tím, že rozloží každé pole, aplikuje pravidla kombinování a vyprodukuje skutečná časová razítka, kdy úloha spustí.
Proč použít tento Cron Parser?
Přečíst cron výraz jako 30 */6 1,15 * * z konfiguračního souboru a přesně vědět, kdy se spustí, vyžaduje mentální aritmetiku napříč pěti poli. Tento parser odvede tu práci okamžitě.
Případy použití Cron Parseru
Referenční příručka syntaxe cron výrazů
Standardní cron výraz má pět polí oddělených mezerami. Každé pole přijímá celá čísla, zástupné znaky, rozsahy, seznamy a krokové hodnoty. Níže uvedená tabulka zobrazuje povolený rozsah a operátory pro každé pole.
| Pole | Rozsah | Operátory | Popis |
|---|---|---|---|
| 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) |
Čtyři speciální znaky řídí způsob, jakým jsou hodnoty v každém poli porovnávány:
| Znak | Název | Chování |
|---|---|---|
| * | 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." |
Zde jsou časté cron výrazy pokrývající většinu potřeb plánování:
| Výraz | Plán |
|---|---|
| * * * * * | 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 |
Příklady kódu
Jak parsovat cron výrazy a vypočítat příští časy spuštění v populárních jazycích:
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"