Cronパーサー
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式とは、繰り返しスケジュールを定義する5つのフィールドをスペースで区切った文字列です。この形式は、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週の毎月曜日」を意味するのではなく、「毎月1日から7日、またはすべての月曜日」を意味します。Cronパーサーは各フィールドを展開し、組み合わせルールを適用することで、このような曖昧さを排除し、ジョブが実際に実行されるタイムスタンプを正確に示します。
このCronパーサーを使う理由
設定ファイルに記載された30 */6 1,15 * *のようなCron式を読んで、いつ実行されるかを正確に把握するには、5つのフィールドにわたる計算が必要です。このパーサーはその作業を即座に行います。
Cronパーサーの使用例
Cron式の構文リファレンス
標準のCron式はスペース区切りの5つのフィールドで構成されます。各フィールドには整数、ワイルドカード、範囲、リスト、ステップ値を指定できます。以下の表に各フィールドの許容範囲と演算子を示します。
| フィールド | 範囲 | 演算子 | 説明 |
|---|---|---|---|
| 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) |
各フィールド内での値のマッチング方法を制御する4つの特殊文字があります:
| 文字 | 名前 | 動作 |
|---|---|---|
| * | 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"