## はじめに
シェルスクリプトを書いていれば必ずお世話になる`date`コマンドは、現在時刻の表示だけでなく、フォーマット指定、相対日時の計算、UNIXタイムスタンプとの相互変換まで幅広くこなす万能ツールです。バックアップファイル名に日付を埋め込んだり、N日前の日付を計算したり、ログのタイムスタンプを変換したり、さまざまな場面で利用されます。
GNU版のdate(多くのLinuxディストリビューションで採用)は、`-d`オプションで自然言語に近い日時指定が可能で、macOS(BSD版)とは引数が異なる点にだけ注意が必要です。
本記事では、dateコマンドの実用テクニックを場面別に紹介します。
## 症状・背景
– バックアップファイル名に日付を入れてユニーク化したい
– 30日前の日付」を自動計算したい
– ログのUNIXタイムを人間可読な時刻に変換したい
– スクリプト内で年月日を組み立てたい
## 手順・設定方法
### ステップ1: 基本表示とフォーマット指定
よく使う書式を押さえます。
“`bash
# 現在時刻(ロケール依存)
date
# ISO 8601形式
date -Iseconds
# カスタムフォーマット
date “+%Y-%m-%d %H:%M:%S”
# ファイル名向けの日時
date “+%Y%m%d_%H%M%S”
# UTC表示
date -u
“`
### ステップ2: 相対日時の計算
`-d`で過去・未来の日付を取得します。
“`bash
# 昨日の日付
date -d “yesterday” +%Y-%m-%d
# 7日前
date -d “7 days ago” +%Y-%m-%d
# 1ヶ月後
date -d “1 month” +%Y-%m-%d
# 来週金曜日
date -d “next friday” +%Y-%m-%d
# 特定日からの相対
date -d “2026-01-01 +90 days” +%Y-%m-%d
“`
### ステップ3: UNIXタイムスタンプとの変換
ログ解析やAPI連携で頻出します。
“`bash
# 現在のUNIXタイム取得
date +%s
# UNIXタイム → 日時に変換
date -d @1715680800
# ISO日時 → UNIXタイム
date -d “2026-05-14 12:00:00″ +%s
# ナノ秒精度
date +%s.%N
“`
### ステップ4: シェルスクリプトでの活用
実用パターンを覚えておきます。
“`bash
# バックアップファイル名
backup_file=”db_$(date +%Y%m%d_%H%M%S).sql.gz”
mysqldump mydb | gzip > “$backup_file”
# ログにタイムスタンプを付与
echo “[$(date -Iseconds)] 処理開始” >> /var/log/myapp.log
# 古いファイルを削除(30日以上前)
find /backup -type f -mtime +30 -delete
# 経過時間の計測
start=$(date +%s)
sleep 3
echo “経過: $(($(date +%s) – start)) 秒”
“`
## 注意事項
– `date -s “…”`での時刻設定は手動設定であり、NTP有効時は推奨されない
– macOS(BSD)版のdateは`-d`の構文が異なる、`date -j`を使う必要がある
– ロケール依存の出力は環境によって変わる、スクリプトでは`LC_ALL=C`を指定
– タイムゾーンに注意、`TZ=UTC date`で一時的に切り替え可能
## まとめ
1. **基本書式**: `+%Y-%m-%d %H:%M:%S` 形式が定番
2. **相対日時**: `-d “N days ago”` で過去日を簡単に算出
3. **UNIXタイム**: `+%s` と `-d @TIMESTAMP` で相互変換
4. **ファイル名**: `$(date +%Y%m%d_%H%M%S)` でユニーク化
5. **スクリプト**: ログタイムスタンプや経過時間計測に活用
関連記事:
– [Linuxのタイムゾーン設定方法](/articles/linux-timezone-setup/)
– [cronで定時実行する基本](/articles/linux-cron-basics/)
– [シェルスクリプトの基本構文](/articles/linux-shell-scripting-basics/)


