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
  1. プリセットボタンをクリックするか、cron式を直接入力してください
  2. 5つのフィールド(分・時・日・月・曜日)に分解して表示します
  3. 「意味」欄に日本語での説明が表示されます
  4. 「次回実行時刻」に現在時刻以降の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
UNIXタイム変換タイムゾーン変換営業日計算

ソースコード

05

このツールのソースコード(テストコードを含む)はGitHubで公開しています。 MITライセンスで自由に利用・改変できます。

GitHub でコードを見る →