calc / schedule
cron 式パーサー
cron式を入力すると日本語で意味を解説し、次回実行時刻を表示します。*/5 * * * * などの各種パターンに対応しています。
プリセット
フィールド分解
0
分
9
時
*
日
*
月
1-5
曜
意味
平日(月〜金)の9時0分に実行
次回実行時刻(5件)
012026/03/18 09:00
022026/03/19 09:00
032026/03/20 09:00
042026/03/23 09:00
052026/03/24 09:00
使い方
01- プリセットボタンをクリックするか、cron式を直接入力してください
- 5つのフィールド(分・時・日・月・曜日)に分解して表示します
- 「意味」欄に日本語での説明が表示されます
- 「次回実行時刻」に現在時刻以降の5件が表示されます
実装コード
02外部ライブラリ不要でそのままコピーして利用できます。matchesField 関数が各フィールドのマッチ判定ロジックです。
export type CronFields = {
minute: string
hour: string
dayOfMonth: string
month: string
dayOfWeek: string
}
export type ParseResult =
| { ok: true; fields: CronFields; description: string }
| { ok: false; error: string }
// フィールド値に対して指定した数値がマッチするか判定
function matchesField(value: string, num: number): boolean {
if (value === '*') return true
if (value.includes(','))
return value.split(',').some(part => matchesField(part.trim(), num))
if (/^\*\/(\d+)$/.test(value)) {
const n = parseInt(value.slice(2), 10)
return n > 0 && num % n === 0
}
const rangeStep = value.match(/^(\d+)-(\d+)\/(\d+)$/)
if (rangeStep) {
const [, a, b, n] = rangeStep.map(Number)
return num >= a && num <= b && n > 0 && (num - a) % n === 0
}
const range = value.match(/^(\d+)-(\d+)$/)
if (range) return num >= Number(range[1]) && num <= Number(range[2])
if (/^\d+$/.test(value)) return parseInt(value, 10) === num
return false
}
// cron式をパース
export function parseCron(expr: string): ParseResult {
const parts = expr.trim().split(/\s+/)
if (parts.length !== 5)
return { ok: false, error: '5フィールド(分 時 日 月 曜日)が必要です' }
const valid = /^[*0-9,\-/]+$/
if (!parts.every(p => valid.test(p)))
return { ok: false, error: '無効な文字が含まれています' }
const fields: CronFields = {
minute: parts[0], hour: parts[1],
dayOfMonth: parts[2], month: parts[3], dayOfWeek: parts[4],
}
return { ok: true, fields, description: describeCron(fields) }
}
// 次のN回の実行時刻を返す
export function getNextExecutions(fields: CronFields, count: number, from?: Date): Date[] {
const cur = from ? new Date(from) : new Date()
cur.setSeconds(0, 0)
cur.setMinutes(cur.getMinutes() + 1)
const results: Date[] = []
for (let i = 0; i < 500_000 && results.length < count; i++) {
if (
matchesField(fields.minute, cur.getMinutes()) &&
matchesField(fields.hour, cur.getHours()) &&
matchesField(fields.dayOfMonth, cur.getDate()) &&
matchesField(fields.month, cur.getMonth() + 1) &&
matchesField(fields.dayOfWeek, cur.getDay())
) results.push(new Date(cur))
cur.setMinutes(cur.getMinutes() + 1)
}
return results
}よくある使用例・注意点
03サーバーサイドcronとcrontab構文
LinuxのcrontabではUNIX cron形式(分 時 日 月 曜日)の5フィールドが基本です。曜日は0=日曜から6=土曜(一部では7も日曜として扱います)。crontabファイルは「crontab -e」で編集でき、ユーザーごとに設定できます。
タイムゾーンの注意点
cronはサーバーのローカルタイムゾーンで動作します。「毎朝9時」と設定してもサーバーがUTCなら日本時間では18時になります。本ツールの次回実行時刻表示はブラウザのローカルタイムゾーン基準です。本番環境ではサーバーのタイムゾーン設定を必ず確認してください。
クラウドスケジューラーでの利用
AWS EventBridge(CloudWatch Events)、GCP Cloud Scheduler、GitHub Actionsのscheduleトリガーなどはcron形式に対応しています。ただしAWS EventBridgeは6フィールド(秒を含む)や曜日と日付の同時指定に制限があるなど、実装によって差異があります。
*/n(ステップ)の動作
*/5 は0, 5, 10, 15...と0からステップします。a-b/n は範囲内でステップします(例: 1-6/2 は 1, 3, 5)。時フィールドで */6 を使うと0, 6, 12, 18時に実行されます。日フィールドの */2 は奇数月に29日以上がある場合に連続実行間隔がずれることがあります。
関連ツール
04ソースコード
05このツールのソースコード(テストコードを含む)はGitHubで公開しています。 MITライセンスで自由に利用・改変できます。
GitHub でコードを見る →