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 표현식은 공백으로 구분된 다섯 개의 필드로 이루어진 문자열로, 반복 실행 일정을 정의합니다. 이 형식은 1979년 Ken Thompson이 Version 7 Unix를 위해 처음 작성한 Unix cron 데몬에서 유래했습니다. 각 필드는 시간 단위를 나타냅니다: 분, 시, 일(월 기준), 월, 요일(주 기준). Cron 표현식을 파싱한다는 것은 이 간결한 표기법을 사람이 읽을 수 있는 설명과 구체적인 향후 실행 시간 목록으로 변환하는 것을 의미합니다.
표준 5개 필드 형식은 Linux와 macOS의 crontab, GitHub Actions와 GitLab CI 같은 CI/CD 플랫폼, AWS(EventBridge), Google Cloud Scheduler, Azure Functions의 클라우드 스케줄러, 그리고 모든 주요 프로그래밍 언어의 작업 스케줄링 라이브러리에서 사용됩니다. 일부 시스템은 초 필드나 연도 필드를 추가해 6개 또는 7개 필드로 형식을 확장하지만, POSIX가 정의한 5개 필드 구조는 모든 구현이 공유하는 기본 기준입니다.
Cron 표현식을 직접 해석하는 것은 오류가 발생하기 쉽습니다. 필드 간의 상호작용이 직관적이지 않은 일정을 만들기 때문입니다. 예를 들어 0 9 1-7 * 1은 '첫 번째 주의 매주 월요일'이 아니라 '매월 1일~7일 또는 매주 월요일'을 의미합니다. Cron 파서는 각 필드를 확장하고 결합 규칙을 적용해 작업이 실제로 실행될 타임스탬프를 명확하게 보여줌으로써 이러한 모호함을 제거합니다.
이 Cron 파서를 사용하는 이유
설정 파일에서 30 */6 1,15 * * 같은 Cron 표현식을 읽고 정확히 언제 실행되는지 파악하려면 다섯 개 필드에 걸친 계산이 필요합니다. 이 파서가 그 작업을 즉시 처리합니다.
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"