「dateコマンドのフォーマット指定がよくわからなくて、毎回ググっている」
現場でよく聞く悩みです。dateコマンドはシェルスクリプトの中で日付処理を担う縁の下の力持ちです。使いこなせれば、ログファイルの自動命名、古いファイルの自動削除、期間計算など、実務での定型作業が一気に自動化できます。
この記事では、dateコマンドの基本フォーマット指定から、日付の加算・減算、シェルスクリプトでの実践的な活用例まで解説します。RHEL 9.4 / Ubuntu 24.04 LTSで動作確認済みです。
この記事のポイント
・date +"%Y-%m-%d" で今日の日付をYYYY-MM-DD形式で取得できる
・date -d "yesterday" や date -d "+7 days" で相対日付計算が可能
・スクリプトのログファイル名に日付を自動付与する実践パターンを解説
・TZやtimedatectlとの連携で時刻ズレの罠を回避する方法も紹介
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
dateコマンドとは何か?どんな場面で使うのか
dateコマンドはLinuxに標準搭載されている時刻表示・操作ユーティリティです。単に現在時刻を表示するだけでなく、フォーマットを自由に指定して日付文字列を生成したり、過去・未来の日付を計算したりできます。現場でdateコマンドが活躍する主な場面は次のとおりです。
・ログファイルに日付を付与する:backup_$(date +%Y%m%d).tar.gz のように日付入りのファイル名を自動生成する
・crontabとの組み合わせ:曜日・日付によって処理を分岐するスクリプトで使う
・ファイルの有効期限チェック:n日前のタイムスタンプを生成してfindと組み合わせる
・タイムゾーン変換:UTC基準のシステム時刻をJST(日本標準時)に変換して表示する
逆に「dateコマンドなんて現在時刻を見るだけでは?」と思っている方は、この記事で認識が変わるはずです。
基本的な使い方
1. 現在の日時を表示する
オプションなしで実行すると、現在の日時が標準フォーマットで出力されます。# 現在の日時を表示(デフォルト) $ date Wed May 7 10:23:41 JST 2026
2. フォーマットを指定して出力する
+以降にフォーマット文字列を指定します。%Yなどのフォーマット指定子を組み合わせて、任意の形式で日付文字列を出力できます。# YYYY-MM-DD 形式で今日の日付を表示 $ date +"%Y-%m-%d" 2026-05-07 # YYYYMMDD(ファイル名向き・区切りなし) $ date +"%Y%m%d" 20260507 # 日時をフルで表示(ログ出力向き) $ date +"%Y-%m-%d %H:%M:%S" 2026-05-07 10:23:41 # 曜日を含む表示 $ date +"%Y-%m-%d(%a)" 2026-05-07(Wed) # Unix タイムスタンプ(エポック秒)で出力 $ date +"%s" 1746577421
| 指定子 | 意味 | 例 |
|---|---|---|
%Y |
西暦(4桁) | 2026 |
%m |
月(2桁ゼロ埋め) | 05 |
%d |
日(2桁ゼロ埋め) | 07 |
%H |
時(24時間・2桁) | 10 |
%M |
分(2桁) | 23 |
%S |
秒(2桁) | 41 |
%a |
曜日(英略称) | Wed |
%A |
曜日(英フル) | Wednesday |
%j |
その年の何日目か | 127 |
%s |
Unixエポック秒 | 1746577421 |
3. 特定の日付・時刻を指定して表示する(-d オプション)
-dオプション(date string)を使うと、任意の日時を指定して出力できます。相対的な表現も使えるのが強力なポイントです。# 昨日の日付を表示 $ date -d "yesterday" +"%Y-%m-%d" 2026-05-06 # 明日の日付を表示 $ date -d "tomorrow" +"%Y-%m-%d" 2026-05-08 # 7日後の日付を表示 $ date -d "+7 days" +"%Y-%m-%d" 2026-05-14 # 30日前の日付を表示 $ date -d "-30 days" +"%Y-%m-%d" 2026-04-07 # 先月1日を表示(month を使う) $ date -d "last month" +"%Y-%m-01" 2026-04-01 # 特定の日付から曜日を求める $ date -d "2026-05-07" +"%A" Thursday # 特定の日時を指定して表示 $ date -d "2026-01-01 00:00:00" +"%s" 1735657200
応用・実務Tips
シェルスクリプトでの日付入りファイル名生成
最もよく使うパターンです。バックアップスクリプトやログローテーションスクリプトで日付を自動付与します。#!/bin/bash # 日付入りバックアップファイルを作成するサンプル TODAY=$(date +"%Y%m%d") BACKUP_FILE="/backup/web_${TODAY}.tar.gz" # バックアップ作成 tar czf "${BACKUP_FILE}" /var/www/html/ echo "バックアップ完了: ${BACKUP_FILE}" # 出力例: バックアップ完了: /backup/web_20260507.tar.gz
7日以上経過した古いファイルを削除する
dateコマンドのエポック秒出力とstatコマンドを組み合わせると、期限切れファイルの自動削除が実現できます。# 7日前のエポック秒を求める EXPIRE_DATE=$(date -d "-7 days" +"%Y-%m-%d") echo "削除対象: ${EXPIRE_DATE} より古いファイル" # findコマンドと組み合わせる場合(-mtime で何日前かを直接指定可能) find /backup/ -name "*.tar.gz" -mtime +7 -type f -delete
ログに秒単位のタイムスタンプを自動挿入する
スクリプトのログ出力に日時を付けるとトラブルシュートが格段に楽になります。#!/bin/bash # タイムスタンプ付きログ関数 log() { echo "[$(date +"%Y-%m-%d %H:%M:%S")] $1" } log "処理開始" # ...処理内容... log "処理完了" # 出力例: # [2026-05-07 10:23:41] 処理開始 # [2026-05-07 10:23:43] 処理完了
TZ変数でタイムゾーンを切り替えて表示する
グローバルなシステムを運用している場合、UTCと日本時間を使い分けたい場面があります。TZ変数を使えばシステム設定を変更せずに特定のタイムゾーンで日時を表示できます。# JST(日本標準時)で表示 TZ=Asia/Tokyo date +"%Y-%m-%d %H:%M:%S" 2026-05-07 10:23:41 # UTC で表示 TZ=UTC date +"%Y-%m-%d %H:%M:%S" 2026-05-07 01:23:41 # ニューヨーク時間で表示 TZ=America/New_York date +"%Y-%m-%d %H:%M:%S" 2026-05-06 21:23:41
曜日による処理の分岐
月曜日だけ集計処理を実行する、土日はバックアップを重複実行しないといった制御がスクリプト内で書けます。#!/bin/bash # 月曜日だけ週次レポートを生成するサンプル DAY_OF_WEEK=$(date +"%u") # 1=月曜 ... 7=日曜 if [ "${DAY_OF_WEEK}" -eq 1 ]; then echo "月曜日: 週次レポートを生成します" # generate-weekly-report.sh else echo "本日は週次レポートの対象外です(曜日: $(date +%A))" fi
トラブルシュート・エラー対処
「date: invalid date」エラーが出る場合
-dオプションに渡す文字列が正しく解釈されないときに発生します。# エラー例 $ date -d "2026/05/07" +"%Y-%m-%d" date: invalid date '2026/05/07' # スラッシュ区切りは受け付けない(ハイフン区切りを使う) $ date -d "2026-05-07" +"%Y-%m-%d" 2026-05-07
スクリプト内でdateの出力が文字化けする場合
LANGがja_JP.UTF-8になっている環境では、%aや%Aの出力が日本語(水、水曜日)になることがあります。英語で曜日を取得したい場合は次のようにします。# LANG設定により曜日が日本語で出力されることがある $ date +"%A" 木曜日 # LC_ALL=C を付けると英語で出力される $ LC_ALL=C date +"%A" Thursday
システム時刻が大幅にずれている場合
dateコマンドの出力が明らかに間違っている場合、システムクロックがずれている可能性があります。root権限があれば手動で設定できますが、NTPを使った自動同期が推奨です。# 現在の時刻・タイムゾーン・NTP同期状態を確認 $ timedatectl status Local time: Thu 2026-05-07 10:23:41 JST Universal time: Thu 2026-05-07 01:23:41 UTC RTC time: Thu 2026-05-07 01:23:41 Time zone: Asia/Tokyo (JST, +0900) System clock synchronized: yes NTP service: active RTC in local TZ: no # NTP同期が無効になっている場合は有効化する $ sudo timedatectl set-ntp true
本記事のまとめ
dateコマンドは単純に見えて、シェルスクリプトの自動化を支える重要なコマンドです。フォーマット指定と-dオプションの相対日付計算を組み合わせるだけで、多くの定型処理が書けるようになります。【注意】-dオプションの日付指定はGNU date(Linux標準)固有の機能です。macOS(BSD date)では使えません。本番サーバーがLinuxであればほぼ問題ありませんが、macのローカル環境でスクリプトをテストする際は要注意です。
| やりたいこと | コマンド |
|---|---|
| 今日の日付をYYYY-MM-DDで取得 | date +"%Y-%m-%d" |
| 今日の日付をYYYYMMDDで取得(ファイル名向き) | date +"%Y%m%d" |
| 現在日時をYYYY-MM-DD HH:MM:SSで取得 | date +"%Y-%m-%d %H:%M:%S" |
| 昨日の日付を取得 | date -d "yesterday" +"%Y-%m-%d" |
| 7日後の日付を取得 | date -d "+7 days" +"%Y-%m-%d" |
| 30日前の日付を取得 | date -d "-30 days" +"%Y-%m-%d" |
| 曜日を数値で取得(1=月曜) | date +"%u" |
| Unixエポック秒を取得 | date +"%s" |
| 特定タイムゾーンで日時を表示 | TZ=Asia/Tokyo date +"%Y-%m-%d %H:%M:%S" |
| NTP同期状態の確認 | timedatectl status |
dateコマンドを使いこなせたら、次はサーバー構築の基礎を固めませんか?
シェルスクリプトでdateコマンドを活用できれば、定型作業の自動化が一気に進みます。その力を活かして、体系的にLinuxサーバー構築を学んでみませんか。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:readlinkコマンドでシンボリックリンクのパスを確認する方法|-fオプションで絶対パス解決も
- 前のページへ:mkfsコマンドでLinuxのファイルシステムを作成する方法|ext4・xfs・tmpfsの使い分けとfstab設定も
- この記事の属するカテゴリ:Linuxtipsへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます