crontab 説明変換 — `0 9 * * 1-5` を「平日 9:00」に
**cron 式** (`0 9 * * 1-5` / `*/5 * * * *` / `0 0 1 * *` / `@daily` / `@hourly` 等) を貼り付けると、**人間が読みやすい日本語 / 英語の説明文** にすぐ変換します。**POSIX 5 フィールド** (分 時 日 月 曜日)、**Spring / Quartz / GitLab の 6 フィールド** (秒 + 5 フィールド)、**Quartz 7 フィールド** (秒 + 5 + 年) すべてに対応。**`*/5 * * * *` → 「5 分ごと」**、**`0 9 * * 1-5` → 「平日 (月〜金)、9:00」**、**`0 0 1 * *` → 「毎月 1 日、0:00」**、**`@daily` → 「毎日 0:00」** のように要点を 1 行で表示。曜日 (`MON` / `TUE` / `1-5`)、月名 (`JAN` / `FEB`)、範囲 (`1-5`)、ステップ (`*/15`)、リスト (`0,15,30,45`) も理解。**各フィールドの内訳テーブル** で「どのフィールドが何を意味しているか」を 1 つずつ確認可能。**cron-next** (次の実行時刻計算) と棲み分け、こちらは **「何のスケジュールか」を人間に説明する** ツールです。**完全にブラウザ内** で処理、外部送信なし。自前パーサー (~480 行、新規依存ゼロ)。
使い方
**入力欄** に cron 式を貼り付けるか、**よくある式** ボタンからプリセットを選ぶと **日本語 / 英語の説明文** が自動で表示されます。下の **フィールド内訳テーブル** で各フィールドが何を意味しているかを 1 つずつ確認可能。エイリアス (`@daily` など) を入力した場合は **展開後の cron 式** も表示します。
詳細解説
cron 式が「読みにくい」からこそ、外に出さずに確認したい
crontab の 5 フィールド形式は慣れた開発者にも直感的ではありません。0 3 */2 * 1-5 が「平日の 2 日おきの午前 3 時」なのか「平日の月曜から金曜の 2 時間おきの 3 分」なのかは、フィールドの順序を知らないと即座に読み取れません。この読みにくさが「オンラインで確認したい」という動機を生みますが、確認対象の cron 式は本番サーバー・CI/CD パイプライン・Kubernetes CronJob から取ってきたものである場合がほとんどです。
本番の crontab の内容は、サービスの定期処理スケジュール・バックアップタイミング・データ同期の頻度という業務情報を含みます。「この式の意味を確認したい」という動機でオンラインサービスに貼り付けることで、そのシステム構成が外部に出ます。
cron 式に含まれる業務情報を外部サービスに渡さない
GitHub Actions のプライベートリポジトリの .github/workflows/*.yml に書かれた cron スケジュール、Kubernetes の spec.schedule、Vercel の vercel.json の cron 設定は、いずれも内部の運用情報です。これらを「説明してもらうため」に外部のサービスに送信すると、cron 式に含まれる業務ロジックの断片が外部サーバーのログに残ります。
cron の説明生成は、5 フィールドの各数値・記号を日本語または英語の文章に変換するだけの処理です。自前パーサーで実装すればサーバー処理は不要で、説明文の生成もブラウザ内で完結します。
自前パーサーによるブラウザ内完結の説明生成
本ツールは POSIX 5 フィールド・Spring/Quartz/GitLab 6 フィールド・Quartz 7 フィールドの各バリアントを自前パーサーで解析します。外部ライブラリに依存せず、正規表現と文字列処理のみで各フィールドの範囲・リスト・ステップ・エイリアス (@daily → 0 0 * * *) を解釈します。説明文は ja / en の 2 言語で、フィールドの意味を組み合わせた自然言語文として生成されます。
入力した cron 式はページメモリ内にのみ存在し、DevTools の Network タブを開いた状態で式を入力・変更しても送信リクエストは発生しません。フィールド内訳テーブルの表示もすべてローカル計算の結果です。
cron-next との組み合わせで完全理解
「この式の意味は何か」を理解するのが本ツール (crontab-explain)、「次にいつ動くか」を確認するのが cron-next ツールです。両方をブラウザのタブで並べて使うと、cron 式の理解とデバッグが外部サービスなしに完結します。特に Kubernetes CronJob や GitHub Actions のスケジュールを変更するとき、変更前後の式を両ツールで確認することで、意図しないスケジュール変更を事前に防げます。
自前パーサーが正規表現と再帰下降で扱うフィールド構造
cron 式の各フィールドは構造化された記法を持ちます。本ツールのパーサーは正規表現と単純な再帰下降で各要素を分解しています。基本要素は: 数値 (5)、範囲 (1-5)、ステップ (*/15 または 1-30/2)、リスト (0,15,30,45)、ワイルドカード (*)、エイリアス (MON / JAN のような名前付きトークン、または @daily のような特殊エイリアス)。これらを「フィールド全体」として連結する , 区切りリストの中にも再帰的に出現できるため、0,5-10,*/30,MON のような複合パターンも正しく分解する必要があります。
説明文の生成は、各フィールドの意味を Σ <時間表現> + <条件表現> の形で組み合わせます。0 9 * * 1-5 であれば「分: 0 (毎時 0 分)」+ 「時: 9 (午前 9 時)」+ 「日: * (毎日)」+ 「月: * (毎月)」+ 「曜日: 1-5 (月曜から金曜)」を、人間が自然に読める順序で再構成して「平日 (月-金) の 9:00」と出力します。リスト・範囲・ステップ・名前付きトークンの組み合わせは指数的にケースが増えるため、フィールドの意味付け関数が独立して動くよう設計されています。
crontab ファイル形式の周辺仕様: 環境変数・シェル・特殊コメント
実際の crontab -e で編集するファイルは、cron 式そのもの以外にも複数の規約を持ちます。最初の数行に SHELL=/bin/bash、PATH=/usr/local/bin:/usr/bin:/bin、MAILTO=admin@example.com のような環境変数定義を書け、これは以降のジョブすべてに適用されます。MAILTO="" (空文字) を指定すると、ジョブの stdout / stderr 出力時のメール送信を抑制できます — これを忘れて本番のスパムフィルタにメールが殺到するのは cron の古典的な落とし穴です。
Vixie cron は # で始まる行をコメントとして扱いますが、cron 式の途中に # を埋め込むことはできません (Quartz の # 特殊文字とは異なる)。% (パーセント) には独特の規約があり、cron 式の後ろのコマンド部分で % は改行に変換され、最初の % までが実際のコマンド、その後ろが標準入力として渡されるという奇妙な仕様があります (echo Hello %World は echo Hello を実行し、stdin に World を流す)。% を文字どおりのパーセント記号として使いたい場合は \% とエスケープが必要で、date +%Y%m%d のような日付フォーマット指定が crontab 内で動かない代表的な理由がこれです。本ツールは cron 式そのものの説明に専念し、これらの周辺規約は扱いませんが、デバッグ時にはこの周辺仕様も確認対象になります。コマンド部の date +%Y%m%d を理解するために実際の指定子を別画面で確認したい場合は date-format-pattern が strftime / dayjs の両系統に対応し、cron が示す「次に動く時刻」を Asia/Tokyo や UTC で並べて見たい場合は timezone-info で IANA タイムゾーンと現在オフセットを突き合わせられます。
よくある質問
- 入力データはサーバーに送信されますか?
- いいえ。**自前パーサー** で **完全にブラウザ内** で処理します。ジョブの中身が漏れる心配はありません。
- 対応している **cron バリアント** は?
- **POSIX 5 フィールド** (`分 時 日 月 曜日`)、**Spring / Quartz / GitLab 6 フィールド** (秒 + 5 フィールド)、**Quartz 7 フィールド** (秒 + 5 + 年) の 3 種類。エイリアスは **`@yearly` / `@annually` / `@monthly` / `@weekly` / `@daily` / `@midnight` / `@hourly`** に対応。`@reboot` は再起動時 1 回実行で **定期実行ではない** ため明示的にエラーにします (cron-next も同様)。
- **ワイルドカード `*`** はどう解釈されますか?
- **「すべて」を意味** します。`* * * * *` は 「毎分」、`* * * * 1-5` は 「平日の毎分」、`0 * * * *` は 「毎時 0 分」のように、`*` のフィールドは説明文から省略されます (情報量を持たないため)。
- **ステップ `*/N`** はどう変換されますか?
- **「N 分ごと」「N 時間ごと」**。例えば `*/5 * * * *` → 「5 分ごと」、`*/30 * * * *` → 「30 分ごと」。**`5-30/3`** のような **範囲 + ステップ** も対応 (`「5-30 分のうち 3 分ごと」`)。
- **`MON` / `TUE` / `JAN` / `FEB`** などの名前は?
- **理解します**。曜日は `SUN`-`SAT` (大文字小文字無視)、月は `JAN`-`DEC`。**`MON-FRI`** や **`MON,WED,FRI`** のような範囲・リストも OK。説明文では「月曜」「Monday」のように locale 別に展開されます。
- **曜日 `7`** は日曜になりますか?
- **なります**。標準的な cron では曜日は 0-6 (日-土) ですが、伝統的に 7 も日曜の別名として扱われます。本ツールも 7 を 0 (日) と同義に扱います。
- **1-5 と平日** の表現は?
- **`1-5` (= 月-金) は「平日」と明示的に置き換え** ます。`0 9 * * 1-5` → 「平日 (月〜金)、9:00」。`MON-FRI` も同じく「平日」表記になります。
- **Quartz の `L`** (最終日 / 最終曜日)、**`W`** (最寄り平日)、**`#`** (n 回目の曜日) は対応していますか?
- **Quartz 拡張は部分的に未対応** です。`L` / `W` / `#` を含む式は **Notes に警告** を出し、それらを無視して基本フィールドだけで説明を生成します。完全な解析が必要なら Java の Quartz 公式ライブラリを使ってください。
- **`?`** (Quartz の placeholder) は?
- **`*` と同じ扱い** で解釈します。Quartz では「曜日と日付の両方を指定するのは矛盾するので、片方は `?` にする」ルールがありますが、本ツールは説明文生成においてどちらも同じ「制約なし」として扱います。
- **日と曜日の両方を指定** したらどうなる?
- **POSIX / Vixie cron では OR 条件** (どちらかにマッチすれば実行)。`0 0 1 * 1` は **「毎月 1 日 または 毎週月曜の 0:00」**。Quartz では AND 条件ですが、本ツールは POSIX 解釈を優先しています (より広く使われているため)。
- **`@reboot`** は説明できますか?
- **意図的にエラー** にします。`@reboot` は **システム起動時の 1 回限り** で、定期実行ではないため「人間が読みやすい説明文」のフォーマットに当てはまりません。`@hourly` などの他のエイリアスは問題なく説明できます。
- **cron-next との違い**は?
- **cron-next** = 「この cron 式の次の実行時刻は?」(具体的な日時を計算)、**crontab-explain** = 「この cron 式は何のスケジュールか?」(人間読みやすい文章)。**両方を貼って併読** すると、cron 式の理解とデバッグが完璧になります。
「送らない」を確かめるには
このツールは入力データを外部に送信しません。仕組み・監査手順・運営方針は以下で詳しく説明しています。
類似のツール
Cron 次回実行時刻 — 5 フィールド対応
`0 9 * * 1-5` のような cron 式の次回実行時刻を一覧表示。件数 (10〜100) を選んで、crontab・GitHub Actions・Kubernetes CronJob・Vercel Cron Jobs などのスケジュールが期待通りに動くか動作確認できます。cron-parser をブラウザ内で実行するので、機密スケジュールも外部に送信せずに検証できます。
日付フォーマット指定子チートシート (dayjs / strftime)
`YYYY-MM-DD` / `%Y-%m-%d` などの日付フォーマット指定子を入力すると、現在時刻 (または任意の基準日) をそのパターンで即時整形します。dayjs (Moment.js 互換) と strftime (C / Python / PHP) の 2 スタイルを Mode 切替、ISO 8601 / RFC 3339 / RFC 2822 / 日本式 / US 式 / ログ用などの 10 プリセット、全トークンチートシート付き。開発者の「あのフォーマット文字列なんだっけ?」問題を一発解消。
期間フォーマット変換 — 秒・mm:ss・hh:mm:ss を相互変換
経過時間 (Duration) を 3 つのフォーマット間で相互変換します。秒数 (5400)、時計表示 (01:30:00)、人間可読 (1h30m) のうち、欲しい出力形式を選ぶだけ。入力は自動判別で、3 形式が 1 行ずつ混在していても OK。複数行を一括変換し、parse できない行は件数だけ表示。1d (= 86400 秒) も含めた d/h/m/s 単位に対応。すべてブラウザ内で処理。
タイムゾーン詳細 (DST) — IANA TZ の現在 offset と切替日を確認
IANA タイムゾーン (Asia/Tokyo, America/New_York, Europe/Paris など) を選ぶと、現在の UTC offset、サマータイム (DST) の有無、次の DST 切替日時、今年と来年の切替リストを表示します。cron 設定で「DST で 1 時間ズレるのに気付かなかった」「夏時間で実行されない時刻 (春の 1 時間ジャンプ) を選んでいた」「2 回実行される時刻 (秋の 1 時間後退) を選んでいた」といった事故を防ぐ用途、海外 SaaS の運用、グローバルチームのリリーススケジュール調整、海外旅行の予定確認に。timezone-convert (任意日時を複数 TZ に翻訳) や world-clock (リアルタイム並列表示) と併用してください。Intl.DateTimeFormat ベース、ブラウザ内で完結します。