Parser wyrażeń cron

Parsuj wyrażenia cron na czytelne opisy i podglądaj kolejne czasy uruchomień

Wypróbuj przykład

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ń

12026-03-26 09:00:00
22026-03-27 09:00:00
32026-03-30 09:00:00
42026-03-31 09:00:00
52026-04-01 09:00:00
62026-04-02 09:00:00
72026-04-03 09:00:00
82026-04-06 09:00:00
92026-04-07 09:00:00
102026-04-08 09:00:00

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.

Natychmiastowe parsowanie
Wpisz lub wklej wyrażenie cron i od razu zobacz czytelny opis oraz 10 kolejnych zaplanowanych uruchomień. Bez przycisku wysyłania, bez przeładowania strony.
🔒
Przetwarzanie z zachowaniem prywatności
Całe parsowanie odbywa się lokalnie w przeglądarce. Twoje wyrażenia cron i dane harmonogramu nigdy nie opuszczają urządzenia.
📋
Analiza pole po polu
Każde z pięciu pól jest parsowane i wyświetlane osobno, wraz z rozwiązanymi wartościami. Jednym spojrzeniem sprawdzisz, które pole steruje harmonogramem.
🔄
Bez rejestracji
Otwórz stronę i zacznij parsować. Bez logowania, bez klucza API, bez instalacji. Działa na każdym urządzeniu z nowoczesną przeglądarką.

Przypadki użycia parsera cron

Frontend developer
Weryfikuj wyrażenia cron w panelach administracyjnych i interfejsach harmonogramowania przed wysłaniem ich do backendu. Sprawdź, czy harmonogram wybrany przez użytkownika w liście rozwijanej odpowiada ciągowi cron wygenerowanemu przez formularz.
Backend engineer
Debuguj zaplanowane zadania uruchamiające się w nieoczekiwanym czasie. Wklej wyrażenie cron z konfiguracji kolejki zadań (Celery, Sidekiq, Quartz) i sprawdź, czy kolejne czasy uruchomień zgadzają się z oczekiwaniami.
DevOps / SRE
Audytuj harmonogramy cron w potokach CI/CD, Kubernetes CronJobs i konfiguracjach harmonogramerów chmurowych. Upewnij się, że zadania kopii zapasowych, odnawianie certyfikatów i skrypty porządkujące są poprawnie zaplanowane przed wdrożeniem.
QA engineer
Sprawdzaj, czy zaplanowane zadania w środowisku testowym odpowiadają harmonogramowi produkcyjnemu. Wychwytuj błędy o jeden w polach miesiąca lub dnia tygodnia, zanim spowodują pominięte uruchomienia na produkcji.
Data engineer
Sprawdzaj wyzwalacze cron dla potoków ETL i zadań synchronizacji danych. Upewnij się, że okna ekstrakcji nie nakładają się i że zależności downstream mają wystarczający zapas czasu.
Student / uczący się
Ucz się składni cron, eksperymentując z różnymi wyrażeniami i obserwując wyniki w czasie rzeczywistym. Zbuduj intuicję co do tego, jak symbole wieloznaczne, zakresy i wartości kroków wzajemnie na siebie wpływają.

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.

PoleZakresOperatoryOpis
Minute0–59* , - /Minute within the hour
Hour0–23* , - /Hour of the day (24-hour)
Day (month)1–31* , - /Day of the month
Month1–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:

ZnakNazwaDziałanie
*WildcardMatches every possible value in the field. * in the minute field means "every minute."
,ListSeparates individual values. 1,15 in the day field means "the 1st and 15th."
-RangeDefines an inclusive range. 1-5 in the day-of-week field means "Monday through Friday."
/StepDefines 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żenieHarmonogram
* * * * *Every minute
0 * * * *Every hour (at minute 0)
*/15 * * * *Every 15 minutes
0 9 * * *Every day at 9:00 AM
0 9 * * 1-5Weekdays at 9:00 AM
30 2 * * 0Every Sunday at 2:30 AM
0 0 1 * *First day of every month at midnight
0 0 * * 1Every 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-5Every 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:

JavaScript (Node.js)
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());
}
Python
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)
Go
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
}
Bash (crontab)
# 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"

Często zadawane pytania

Jaka jest różnica między wyrażeniami cron 5-polowymi a 6-polowymi?
Standardowy format cron (POSIX) ma 5 pól: minuta, godzina, dzień-miesiąca, miesiąc, dzień-tygodnia. Niektóre narzędzia jak Quartz Scheduler i Spring dodają pole sekund na początku, tworząc 6 pól. AWS EventBridge używa 6 pól z polem roku na końcu. Ten parser obsługuje standardowy format 5-polowy, kompatybilny z crontab, GitHub Actions, Kubernetes CronJobs i większością bibliotek do harmonogramowania.
Jak cron obsługuje jednoczesne ustawienie dnia-miesiąca i dnia-tygodnia?
Gdy oba pola są ograniczone (nie *), cron stosuje logikę OR: zadanie uruchamia się, gdy spełniony jest jeden z warunków. Na przykład 0 9 15 * 1 oznacza 'o 9:00 piętnastego każdego miesiąca LUB każdego poniedziałku'. To częste źródło nieporozumień. Jeśli oba pola są ustawione na *, zadanie uruchamia się każdego dnia.
Jakiej strefy czasowej używa cron?
Tradycyjny crontab działa w lokalnej strefie czasowej systemu. Kubernetes CronJobs domyślnie korzysta ze strefy czasowej kube-controller-manager (zazwyczaj UTC), ale od Kubernetes 1.25 obsługuje opcjonalne pole .spec.timeZone. AWS EventBridge i Google Cloud Scheduler pozwalają określić strefę czasową dla każdego harmonogramu osobno. Zawsze sprawdź, której strefy czasowej używa Twój harmonogramer przed wdrożeniem zadania cron.
Czy cron może uruchamiać zadanie co 30 sekund?
Standardowy 5-polowy cron nie obsługuje harmonogramowania poniżej minuty. Najmniejszy interwał to jedna minuta (*/1 lub *). Aby uruchamiać coś co 30 sekund, potrzebujesz 6-polowego cron z polem sekund (Quartz, Spring), skryptu opakowującego czekającego 30 sekund i uruchamiającego się ponownie, albo innego mechanizmu harmonogramowania, takiego jak timery systemd z OnCalendar.
Czy 0 i 7 oznaczają to samo w polu dnia-tygodnia?
W większości implementacji cron zarówno 0, jak i 7 reprezentują niedzielę. Konwencja ta pochodzi z oryginalnego cron systemu Unix. Jednak niektóre systemy (Quartz) używają 1 dla niedzieli i 7 dla soboty. POSIX definiuje zakres 0-6, gdzie 0 = niedziela. Jeśli Twój harmonogramer akceptuje nazwane dni (SUN, MON), używaj ich, aby uniknąć niejednoznaczności.
Co się stanie, gdy ustawię dzień miesiąca, który nie istnieje?
Jeśli zaplanujesz zadanie na 31. dzień (0 0 31 * *), nie uruchomi się ono w miesiącach mających mniej niż 31 dni. Cron nie przenosi uruchomienia na kolejny miesiąc. Luty zawsze zostanie pominięty, podobnie jak kwiecień, czerwiec, wrzesień i listopad. Aby uruchamiać zadanie ostatniego dnia każdego miesiąca, niektóre implementacje cron obsługują modyfikator L (0 0 L * *), ale standardowy cron POSIX go nie obsługuje.
Jak przetestować wyrażenie cron przed wdrożeniem?
Użyj parsera online, takiego jak ten, aby zobaczyć kolejne czasy uruchomień i sprawdzić, czy harmonogram odpowiada Twoim oczekiwaniom. Do walidacji na produkcji większość bibliotek cron udostępnia funkcję obliczania następnego uruchomienia: cron-parser w Node.js, croniter w Python, robfig/cron w Go. Uruchom wyrażenie przez jedną z tych funkcji w zestawie testów, aby potwierdzić N kolejnych czasów wykonania przed wdrożeniem.