cron式の逆引き|毎週月曜9時・月末・第2月曜の書き方
毎週月曜9時は「0 9 * * 1」、平日9時は「0 9 * * 1-5」です。やりたい日時から cron 式を引ける一覧に加え、日と曜日を両方書くと「または」になる罠、月末・第2月曜・隔週のように式だけでは書けない条件の回り道、GitHub Actions の時刻が UTC になる点まで整理します。
公開読了目安 約6分

この記事の要点
- 毎週月曜9時は 0 9 * * 1、平日9時は 0 9 * * 1-5
- 日と曜日を両方書くと「両方を満たす日」ではなく「どちらかの日」に動く
- 月末・第2月曜・隔週は5つの欄だけでは書けず、コマンド側で日付を確かめる
- */40 や日付の */7 は、月や時をまたぐと間隔がそろわない
- GitHub Actions の schedule は既定で UTC なので、日本時間から9時間引く
目次
毎週月曜の 9 時に動かすなら 0 9 * * 1、平日の 9 時なら 0 9 * * 1-5 です。
cron 式は「分・時・日・月・曜日」の 5 つの欄を、半角スペースで区切って並べます。
ブログの予約処理やバックアップ、毎朝の集計メールなど、身近な自動処理の多くはこの式で時刻を決めています。 1 文字の書き違いで「月に 1 回のはずが毎日届く」こともあるので、書く前に引ける一覧と、式だけでは書けない条件を整理します。
5 つの欄の並びと、どの時計で動くか
欄は左から順に、分(0〜59)・時(0〜23)・日(1〜31)・月(1〜12)・曜日(0〜7)です。 曜日は 0 と 7 がどちらも日曜で、1 が月曜、6 が土曜にあたります。
* は「すべて」、, は列挙、- は範囲、/ は間隔を表します。
9-17 は 9 時と 17 時を含む範囲です。
時刻は、cron を動かすコンピューターの時計で決まります。 日本時間に合わせたサーバーなら日本時間で、UTC のままのサーバーやサービスなら UTC で読まれます。
やりたい日時から引く一覧
決まった日時に動かす式です。 時刻はすべて、cron を動かす側の時計の時刻です。
| やりたいこと | 式 |
|---|---|
| 毎日 9:00 | 0 9 * * * |
| 平日(月〜金)9:00 | 0 9 * * 1-5 |
| 毎週月曜 9:00 | 0 9 * * 1 |
| 土日 10:00 | 0 10 * * 0,6 |
| 毎月1日 0:00 | 0 0 1 * * |
| 毎月1日と15日 6:00 | 0 6 1,15 * * |
| 1・4・7・10月の1日 0:00 | 0 0 1 1,4,7,10 * |
| 毎年1月1日 0:00 | 0 0 1 1 * |
一定の間隔でくり返す式です。
| やりたいこと | 式 |
|---|---|
| 5分ごと | */5 * * * * |
| 毎時30分 | 30 * * * * |
| 2時間ごと(0時から) | 0 */2 * * * |
| 平日9〜18時の毎時0分 | 0 9-18 * * 1-5 |
1,4,7,10 は */3 と書いても同じ月になります。
*/3 は 1 月から数えて 3 つおきなので、2・5・8・11 月にしたいときは 2-12/3 と範囲を書きます。
日と曜日を両方書くと「または」になる
よくある書き違いが、日の欄と曜日の欄を両方指定する形です。
「8〜14 日の月曜=第 2 月曜」のつもりで 0 9 8-14 * 1 と書くと、狙いどおりには動きません。
Debian の cron の説明書は、日と曜日の両方が * でないとき、どちらかに当てはまれば実行すると定めています。
0 9 8-14 * 1 は「毎月 8〜14 日の毎日」と「毎週月曜」を合わせた日に動きます。
2026 年 10 月 9 日の昼に、この式をcron 式の説明ツールへ入れてみました。 次の実行日は 10 月 10 日(土)・11 日(日)・12 日(月)…と並びます。
ツールも「日付と曜日の両方が指定されています。OR条件として扱います。」と注意を出します。
式だけでは書けない 3 つの条件
月末
月の最終日は、月によって 28〜31 日と変わります。 Debian の crontab の説明書には、月末を表す記号がありません。
回り道は 2 つあります。 1 つは、翌月 1 日の 0:00 に「前月ぶん」の処理として動かす方法です。
もう 1 つは、28〜31 日に毎日起動して、翌日が 1 日のときだけ本体を動かす方法です。 GNU の date コマンドがある環境なら、次のように書けます。
0 23 28-31 * * [ "$(date -d tomorrow +\%d)" = "01" ] && /path/to/job.sh
% の前の \ は省けません。
crontab のコマンド欄では、\ の無い % が改行に置き換わるためです。
第 2 月曜(第 n 何曜日)
第 2 月曜は、必ず 8〜14 日のどれかに来ます。
そこで日の欄だけを 8-14 にし、曜日はコマンド側で確かめます。
0 9 8-14 * * [ "$(date +\%u)" = "1" ] && /path/to/job.sh
date +%u は月曜を 1、日曜を 7 で返します。
第 1 なら 1-7、第 3 なら 15-21、第 4 なら 22-28 と、日の範囲だけを変えます。
隔週
「2 週間に 1 回」は、5 つの欄のどれでも表せません。
毎週動かして、コマンド側で週番号(date +%V の ISO 週番号)の偶数・奇数を見る方法があります。
ただし週番号は年をまたぐと 1 に戻ります。 2026 年は 53 週まであるので、53 週(奇数)の翌週は 2027 年の 1 週(奇数)です。
奇数週に動かす設定では、年末年始に 2 週続けて実行されます。 年をまたいでもそろえたいときは、決めた基準日からの経過日数を 14 で割った余りで判定します。
間隔の「/」がそろわない場面
/ は、範囲の先頭から数えて n おきの値を選ぶ記号です。
「前回の実行から n 分後」ではないので、割り切れない間隔では間があきます。
*/40 * * * *: 毎時 0 分と 40 分に動きます。間隔は 40 分と 20 分の交互です0 0 */7 * *: 毎月 1・8・15・22・29 日に動きます。10 月 29 日の次は 11 月 1 日で、3 日しか空きません*/30 9-17 * * 1-5: 17 時台も範囲に入るので、最後は 17:30 です
17:00 で止めたいなら、*/30 9-16 * * 1-5 と 0 17 * * 1-5 の 2 行に分けます。
40 分ごとのように 60 を割り切れない間隔は、1 行の式ではそろいません。
書く前に知っておきたい環境ごとの違い
曜日や月の名前は範囲にしない
曜日と月は MON や JAN のような 3 文字の名前でも書けます。
ただし Debian の説明書は、名前を範囲や列挙にすることを認めていません。
MON-FRI を受け付ける実装もありますが、1-5 と数字で書けばどちらでも同じ意味で読まれます。
曜日の範囲は数字で書くのが無難です。
GitHub Actions は既定で UTC
GitHub Actions の schedule は、既定では UTC で時刻を読みます。
日本時間は UTC より 9 時間進んでいるので、式の時は日本時間から 9 を引いた値にします。
日本時間の毎朝 9:00 は、UTC の 0:00 なので 0 0 * * * です。
日本時間の月曜 8:00 は UTC の日曜 23:00 になり、曜日まで 0 23 * * 0 とずれます。
timezone に Asia/Tokyo のような地域名を添えて、その地域の時刻で読ませる方法もあります。
最短の間隔は 5 分で、毎時 0 分のような混む時刻は実行が遅れたり、取りやめられたりすることがあると書かれています。
夏時間のある地域の時計
日本には今は夏時間が無いので、日本時間のサーバーでは時刻が飛びません。 夏時間のある地域の時計で動かすと、切り替えの日に 1 時間が飛んだり、くり返したりします。
Debian の cron は、3 時間未満の時計の変化を特別に扱います。 時刻を決めた処理のうち、飛んだ時刻のものは変化の直後に動かし、くり返した時刻のものはもう一度は動かしません。
UTC と日本時間、夏時間の関係は、UTCと日本時間の違いで詳しく扱っています。
書いた式を確かめる
式を書いたら、次の実行日時を並べて、狙った日だけが出るかを見ます。 cron 式の説明ツールは、式を日本語の説明に直し、次の実行日時を最大 10 件まで並べます。
ツールの次回実行は、開いているパソコンやスマホの時計で数えます。 UTC で動くサービス向けの式は、UTC に直した時刻で読み替えてください。
月末の L や第 n 曜日の # のように、一部のサービスだけが持つ記号はツールでは読めません。
入れると「値が不正です」と出るので、使えるかどうかはサービスの説明書で確かめます。
関連記事
- cron式の書き方を日本語で確かめる使い方:ツールの操作手順とプリセット
- UTCと日本時間の違い|時差がサマータイムでずれる理由:UTC で動くサービスの時刻の読み方
- UNIXタイムスタンプを日時に変換する使い方:ログに残った実行時刻の読み方
まとめ
決まった日時なら、一覧の式を写して数字を差し替えれば足ります。 日と曜日を両方書くと「どちらかの日」になる点だけは、書いたあとに次の実行日で確かめてください。
月末・第 2 月曜・隔週は、式を広めに書いてコマンド側で日付を確かめます。 UTC で動く環境では、日本時間から 9 時間引いた時刻と、ずれた曜日で書き直します。
参考・出典
- crontab(5) — tables for driving cron(Debian bookworm) — Debian (2026-10-09 閲覧)
- cron(8) — daemon to execute scheduled commands(Debian bookworm) — Debian (2026-10-09 閲覧)
- Events that trigger workflows(schedule) — GitHub Docs (2026-10-09 閲覧)
本記事は上記の公的機関・公式情報源を参考にしています。最新の情報は各リンク先をご確認ください。
あわせて読みたい
同じテーマ・関連ツールの記事です。