【Linux】dateコマンドの使い方|日付フォーマット・%mと%Mの罠・-dで日付計算

【Linux】dateコマンドの使い方|日付フォーマット・%mと%Mの罠・-dで日付計算 Linux

dateは、現在の日付・時刻を表示したり、好きな書式に整形したりするコマンドです。単に今の時刻を知るだけでなく、バックアップファイルの名前に日付を入れる「3日前」「来月」といった日付を計算するUNIXタイムスタンプを人間が読める日付に変換するなど、スクリプトの中で驚くほど幅広く活躍します。

ただし、書式指定には初心者が必ず引っかかる罠があります。それは%m(月)と%M(分)の取り違えです。大文字・小文字が違うだけで意味がまったく変わるため、「月を出したつもりが分が出た」という失敗が後を絶ちません。この記事では、実機のLinux(WSLのDebian)で書式や日付計算を実際に動かしながら、dateの使い方を整理します。

先に結論

  • date +"書式"で日付を整形します(例: date +"%Y-%m-%d")。
  • %mは月、%Mは分、%Hは時。大文字小文字で意味が変わります。
  • date -d "tomorrow"-d "3 days ago"で日付を計算できます。
  • date +%sでUNIXタイムスタンプ、date -d @秒数で逆変換します。
  • TZ=Asia/Tokyo dateのようにタイムゾーンを指定できます。
  • ファイル名にはdate +%Y%m%d_%H%M%Sのような形式が便利です。

日付でファイルを検索するfind、定期実行するcron、ファイル日時を操作するtouchもあわせて参考になります。

スポンサーリンク

基本と日付フォーマット(+書式)

dateだけで現在日時が表示されます。+に続けて書式を指定すると、好きな形に整形できます。書式は%Y(年)%m(月)%d(日)などの変換指定子を組み合わせて作ります。

date の基本と整形
# そのまま実行すると現在日時
date
# Sun Jul 12 06:34:21 JST 2026

# +書式 で好きな形式に
date +"%Y-%m-%d"
# 2026-07-12

date +"%Y/%m/%d %H:%M:%S"
# 2026/07/12 06:34:21

# よく使う変換指定子
#   %Y 年(4桁)  %m 月  %d 日
#   %H 時(24)   %M 分  %S 秒
#   %A 曜日     %j 通算日  %s UNIX秒

実機でも、date +"%Y-%m-%d"2026-07-12date +"%Y/%m/%d %H:%M:%S"2026/07/12 06:34:21のように整形できることを確認しました。書式の中には-/:、スペースなどの文字をそのまま混ぜられるので、目的に合った日付表記を自由に作れます。書式全体は、途中にスペースが入ることが多いためダブルクォートで囲むのが安全です。

【最重要】%m(月)と%M(分)の罠

dateで最も多い失敗がこれです。%mは「月(month)」、%Mは「分(Minute)」で、大文字か小文字かだけで意味がまったく変わります。さらに%Hは「時(Hour)」で、これも混同しがちです。

大文字小文字で意味が変わる(実証)
# 同じ「06:34(6時34分・7月)」の状態で比べると…
date +"%m"
# 07     ← 小文字 m は「月」

date +"%M"
# 34     ← 大文字 M は「分」

date +"%H"
# 06     ← 大文字 H は「時(24時間)」

# ありがちな間違い:時刻を出したいのに %m を書いてしまう
date +"%H:%m"
# 06:07  ← 「6時07分」のつもりが、07 は"月"!正しくは %H:%M
%mは月・%Mは分・%Hは時(実証)

実機で、7月12日6時34分の状態で確認したところ、%m07(月)、%M34(分)、%H06(時)と、それぞれ異なる値を返しました。とくにありがちなのが、時刻「時:分」を出したいのに%H:%mと書いてしまい、分の位置に「月」が表示されるミスです(正しくは%H:%M)。覚え方としては、小文字のmは「月(month)」、大文字のMは「分(Minute)」、そしてHは「Hour=時」です。日付は小文字寄り(%y %m %d)、時刻の分だけ大文字%M、と整理すると混乱しにくくなります。ログのタイムスタンプやファイル名で日時がおかしいときは、まずこの大文字小文字を疑ってください。

【便利】-dで日付を計算する

dateの隠れた主役が-dオプションです。「明日」「3日前」「来月」といった相対的な日付を、英語の表現で計算できます。バックアップの世代管理や、期限の計算などで非常に役立ちます。

-d で相対日付を計算
# 明日・昨日
date -d "tomorrow" +"%Y-%m-%d"
# 2026-07-13
date -d "yesterday" +"%Y-%m-%d"

# 〜前・〜後(day / week / month / year)
date -d "1 day ago" +"%Y-%m-%d"
# 2026-07-11
date -d "+1 week" +"%Y-%m-%d"
# 2026-07-19
date -d "next month" +"%Y-%m-%d"
# 2026-08-12

# 特定の日付を解釈して曜日を求める
date -d "2026-12-25" +"%Y-%m-%d は %A"
# 2026-12-25 は Friday
「来月」「3日前」を英語表現で計算できる(実証)

実機で、-dにさまざまな表現を渡して確認しました。date -d "tomorrow"翌日(2026-07-13date -d "1 day ago"前日(2026-07-11date -d "+1 week"1週間後(2026-07-19date -d "next month"翌月(2026-08-12と、いずれも正しく計算されました。さらにdate -d "2026-12-25"のように特定の日付を渡すと、その日を解釈でき、%Aを付けることで「2026年のクリスマスは金曜日(Friday)」と曜日まで求められました。dayweekmonthyearと、ago(前)や+(後)を組み合わせるだけで、複雑な日付計算をコマンド1つでこなせます。cronで「7日以上前のバックアップを削除する」といった処理の基準日を求めるのに最適です。

UNIXタイムスタンプとの変換

プログラムやログでよく使われるUNIXタイムスタンプ(1970年からの経過秒数)との相互変換もできます。%sで現在のタイムスタンプ、-d @秒数で逆にタイムスタンプから日付に戻せます。

UNIXタイムスタンプの変換
# 現在のUNIXタイムスタンプ(秒)
date +%s
# 1783805661

# タイムスタンプ → 人間が読める日付(@ を付ける)
date -d @1783000000 +"%Y-%m-%d %H:%M:%S"
# 2026-07-02 22:46:40

# ミリ秒やナノ秒が必要なとき
date +%s%N     # ナノ秒まで

実機でも、date +%s現在のUNIXタイムスタンプが得られ、date -d @1783000000そのタイムスタンプを日付(2026-07-02 22:46:40)に変換できることを確認しました。ログにUNIXタイムスタンプで記録されている時刻を「人間が読める形」に直したいときや、逆にプログラムへ渡す秒数を求めたいときに重宝します。%s%Nを使えばナノ秒精度のタイムスタンプも取得でき、処理時間の計測などに使えます。

タイムゾーンを指定する(TZ)

TZ環境変数を付けて実行すると、その場だけ別のタイムゾーンで日時を表示できます。海外サーバーとの時刻合わせや、複数地域の時刻確認に便利です。

TZでタイムゾーン変更
# その場だけタイムゾーンを変えて実行
TZ=UTC date +"%H:%M"
# 21:34   (協定世界時)

TZ=Asia/Tokyo date +"%H:%M"
# 06:34   (日本時間)

TZ=America/New_York date +"%H:%M"
# 17:34   (ニューヨーク時間)

実機でも、同じ瞬間にTZ=UTC21:34TZ=Asia/Tokyo06:34TZ=America/New_York17:34と、タイムゾーンごとに異なる時刻が表示されることを確認しました。TZ=タイムゾーン名 dateという書き方は、その場限りの環境変数としてコマンドの前に付けるもので、シェル全体の設定は変えません。UTCとの時差確認や、海外拠点の現在時刻を知りたいときにさっと使えます。

ファイル名への活用

dateの実用例として最も多いのが、バックアップファイルなどの名前に日時を埋め込む使い方です。コマンド置換$(...))と組み合わせます。

ファイル名に日時を入れる
# 日時入りのバックアップファイル名
tar czf "backup_$(date +%Y%m%d_%H%M%S).tar.gz" /path/to/data
# → backup_20260712_063421.tar.gz のような名前になる

# 日付ごとのログファイル
echo "ログ" >> "app_$(date +%Y-%m-%d).log"
# → app_2026-07-12.log

# cronと組み合わせた定番の使い方
# 0 2 * * * tar czf /backup/db_$(date +\%Y\%m\%d).tar.gz /var/lib/db

実機でも、date +%Y%m%d_%H%M%S20260712_063421という、ファイル名に使いやすい日時文字列が得られることを確認しました。$(date ...)というコマンド置換でファイル名に埋め込めば、実行するたびに一意な名前のバックアップが作れます。なおcronの中で使う場合は、%が特別な意味を持つため\%のようにエスケープが必要な点に注意してください(cronの記事で解説しています)。

主な変換指定子・オプション

dateでよく使う書式とオプションをまとめます。

指定子 / オプション 意味
%Y / %m / %d 年 / / 日
%H / %M / %S 時 / / 秒
%A / %s 曜日 / UNIXタイムスタンプ
-d "表現" 日付を計算・解釈(tomorrow等)
-d @秒数 UNIXタイムスタンプ→日付
TZ=地域 date タイムゾーンを指定

よくある失敗

時刻の「分」を出したいのに月が出る

%mは月、%Mが分です。時刻は%H:%M:%Sと書きます。

書式をクォートで囲まずエラーになる

スペースを含む書式はdate +"..."とダブルクォートで囲みます。

+を付け忘れる

書式指定には先頭に+が必要です(date +"%Y")。

cronの中で%がうまく動かない

cronでは%\%とエスケープする必要があります。

-dの表現を日本語で書く

-dの相対表現は英語です(tomorrow3 days agoなど)。

よくある質問

Qdateで日付を好きな形式で表示するには?
Adate +"書式"を使います。たとえばdate +"%Y-%m-%d"で「2026-07-12」、date +"%Y/%m/%d %H:%M:%S"で「2026/07/12 06:34:21」のように整形できます。%Yが年、%mが月、%dが日、%Hが時、%Mが分、%Sが秒です。
Q%mと%Mの違いは何ですか?
A%m(小文字)は「月」、%M(大文字)は「分」です。大文字小文字で意味がまったく変わります。実機でも、7月34分の状態で%mは07(月)、%Mは34(分)を返すことを確認しています。時刻を出したいときに%H:%mと書くと分の位置に月が出てしまうので、正しくは%H:%Mです。
Q「3日前」や「来月」の日付を計算できますか?
Adate -dで計算できます。date -d "3 days ago" +"%Y-%m-%d"で3日前、date -d "next month"で来月、date -d "tomorrow"で明日です。実機でも、これらの相対表現が正しく計算されることを確認しています。表現は英語で書きます。バックアップの世代管理などに便利です。
QUNIXタイムスタンプを日付に変換するには?
Adate -d @タイムスタンプを使います。date -d @1783000000 +"%Y-%m-%d %H:%M:%S"のように@を付けて秒数を渡すと、人間が読める日付に変換されます。逆に現在のタイムスタンプを得るにはdate +%sです。実機でも両方の変換を確認しています。
Q別のタイムゾーンの時刻を知りたいです。
Aコマンドの前にTZ=タイムゾーン名を付けます。TZ=UTC dateで協定世界時、TZ=America/New_York dateでニューヨーク時間が表示されます。実機でも、同じ瞬間にタイムゾーンごとに異なる時刻が出ることを確認しています。シェル全体の設定は変わらず、そのコマンドの間だけ有効です。

まとめ

  • date +"書式"で整形。%Y %m %d %H %M %Sが基本の指定子です。
  • %mは月、%Mは分、%Hは時——大文字小文字に注意します。
  • date -d "tomorrow"などで日付を計算できます(英語表現)。
  • %s-d @秒数でUNIXタイムスタンプを相互変換します。
  • TZ=地域 dateでタイムゾーンを指定できます。

dateは、時刻を知るだけでなく、日付計算・タイムスタンプ変換・ファイル名生成まで担う、スクリプトの縁の下の力持ちです。「分は大文字%M」という一点さえ押さえれば、日時の扱いで悩むことはほとんどなくなります。crontouchと組み合わせて、日付を軸にした自動化に活用しましょう。