Parser wyrażeń cron
Parsuj wyrażenia cron na czytelne opisy i podglądaj kolejne czasy uruchomień
Wyrażenie cron
minute hour day(month) month day(week)
Czytelny opis
At 9:00 AM, Mon, Tue, Wed, Thu, Fri
Podział pól
Minute
0
0–59
Hour
9
0–23
Day (month)
*
1–31
Month
*
1–12
Day (week)
1-5
0–6
10 kolejnych zaplanowanych uruchomień
Czym jest parsowanie wyrażeń cron?
Wyrażenie cron to ciąg pięciu pól oddzielonych spacjami, który definiuje cykliczny harmonogram. Format ten wywodzi się z demona cron systemu Unix, napisanego po raz pierwszy przez Kena Thompsona dla Version 7 Unix w 1979 roku. Każde pole reprezentuje jednostkę czasu: minutę, godzinę, dzień miesiąca, miesiąc oraz dzień tygodnia. Parsowanie wyrażenia cron oznacza przekształcenie tej zwięzłej notacji w czytelny opis i konkretną listę nadchodzących czasów wykonania.
Standardowy format pięciu pól jest stosowany przez crontab w systemach Linux i macOS, przez platformy CI/CD takie jak GitHub Actions i GitLab CI, przez harmonogramery chmurowe w AWS (EventBridge), Google Cloud Scheduler i Azure Functions, a także przez biblioteki do planowania zadań w każdym popularnym języku programowania. Niektóre systemy rozszerzają format do sześciu lub siedmiu pól, dodając pole sekund lub rok, jednak układ pięciu pól zdefiniowany przez POSIX pozostaje punktem odniesienia wspólnym dla wszystkich implementacji.
Ręczne parsowanie wyrażeń cron jest podatne na błędy. Interakcja między polami tworzy nieoczywiste harmonogramy: 0 9 1-7 * 1 nie oznacza 'każdy poniedziałek w pierwszym tygodniu', lecz 'od 1. do 7. dnia każdego miesiąca LUB każdy poniedziałek'. Parser cron eliminuje tę niejednoznaczność, rozwijając każde pole, stosując reguły łączenia i zwracając rzeczywiste znaczniki czasu uruchomień zadania.
Dlaczego warto używać tego parsera cron?
Odczytanie wyrażenia cron w stylu 30 */6 1,15 * * z pliku konfiguracyjnego i ustalenie dokładnego czasu uruchomień wymaga obliczeń w pamięci dla pięciu pól. Ten parser wykonuje tę pracę natychmiastowo.
Przypadki użycia parsera cron
Dokumentacja składni wyrażeń cron
Standardowe wyrażenie cron ma pięć pól oddzielonych spacjami. Każde pole przyjmuje liczby całkowite, symbole wieloznaczne, zakresy, listy i wartości kroków. Poniższa tabela przedstawia dozwolony zakres i operatory dla każdego pola.
| Pole | Zakres | Operatory | Opis |
|---|---|---|---|
| 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) |
Cztery znaki specjalne kontrolują sposób dopasowywania wartości w każdym polu:
| Znak | Nazwa | Działanie |
|---|---|---|
| * | 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." |
Oto typowe wyrażenia cron pokrywające większość potrzeb harmonogramowania:
| Wyrażenie | Harmonogram |
|---|---|
| * * * * * | 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 |
Przykłady kodu
Jak parsować wyrażenia cron i obliczać kolejne czasy uruchomień w popularnych językach:
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"