はじめに

こんにちは!今回はdateコマンドについて解説します。

dateは現在の日付・時刻を表示するコマンドです。一見シンプルですが、日付フォーマットのカスタマイズやシステム時刻の設定など、実用的な機能が満載です。

ログファイルに日付を付ける、バックアップファイルに日付を埋め込む、シェルスクリプトで日時を扱う……シェル作業では毎日使うと言っても過言ではないコマンドですよ。


dateコマンドとは

dateは、システムの現在の日付・時刻を表示し、フォーマットを自由に変更できる外部コマンドです。

デフォルトでは人間が読みやすい形式で表示されますが、フォーマット指定子を使うことで、Unixタイムスタンプ、ISO 8601形式、カスタム形式など、様々な出力が可能です。ログファイルの管理、スクリプトの自動化、システム時刻の設定に欠かせません。

主な用途:

  • 現在の日付・時刻表示
  • ファイル名やログに日付を埋め込む
  • Unixタイムスタンプの取得
  • システム時刻の設定

基本構文

1
date [オプション] [フォーマット指定]

フォーマット指定子を使って、出力形式をカスタマイズできます。


主なオプション

オプション 説明
-d, --date=STRING 指定した日付を表示
-f, --file=DATEFILE ファイルから日付を読み込む
-R, --rfc-email RFC 2822形式で表示
-I[TIMESPEC], --iso-8601 ISO 8601形式で表示
-u, --utc UTC時刻で表示
-s, --set=STRING システム時刻を設定(rootのみ)
+フォーマット カスタムフォーマットで出力

使用例

例1: 現在の日付・時刻を表示

1
date

実行結果:

1
Fri Jan  3 10:30:45 JST 2026

デフォルト形式で現在の日付・時刻を表示します。最もシンプルな使い方です。


例2: ISO 8601形式で表示

1
date -I

実行結果:

1
2026-01-03

ISO 8601形式(YYYY-MM-DD)で日付のみ表示します。国際標準形式です。


例3: 秒までのISO 8601形式

1
date -I seconds

実行結果:

1
2026-01-03T10:30:45+09:00

時刻までを含むISO 8601形式で表示します。タイムゾーン情報も含まれます。


例4: Unixタイムスタンプ(エポックからの秒数)

1
date +%s

実行結果:

1
1767502245

1970年1月1日0時0分0秒(UTC)からの経過秒数を表示します。プログラム間で時刻を扱う時に便利です。


例5: カスタムフォーマット(年月日)

1
date +%Y-%m-%d

実行結果:

1
2026-01-03

+の後にフォーマット指定子を指定して、任意の形式で表示できます。これは年-月-日形式です。


例6: カスタムフォーマット(日本語的な表示)

1
date "+%Y年%m月%d日(%A) %H:%M:%S"

実行結果:

1
2026年01月03日(Friday) 10:30:45

複数の指定子を組み合わせて、カスタム形式を作成できます。


例7: 特定の日付を計算

1
date -d "2026-01-03 +10 days"

実行結果:

1
Sun Jan 13 10:30:45 JST 2026

-dオプションで、相対的な日付(今日から10日後など)を計算できます。


例8: 過去の日付を指定

1
date -d "2026-01-01" +%Y-%m-%d

実行結果:

1
2026-01-01

特定の日付情報を指定して、その日付のフォーマットを表示できます。


例9: UTC時刻で表示

1
date -u

実行結果:

1
Fri Jan  3 01:30:45 UTC 2026

-uオプションでUTC(協定世界時)で表示します。サーバーのタイムゾーン設定に関係なく表示できます。


例10: バックアップファイル名に日付を埋め込む

1
cp myfile.txt myfile_$(date +%Y%m%d).txt

実行結果:

1
(myfile_20260103.txtが作成される)

シェルスクリプトで日付を変数展開して、ファイル名に埋め込みます。超実用的!


Tips・注意点

フォーマット指定子の主なもの

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
%Y   # 4桁の年 (2026)
%y   # 2桁の年 (26)
%m   # 月 (01-12)
%d   # 日 (01-31)
%H   # 時 (00-23)
%M   # 分 (00-59)
%S   # 秒 (00-59)
%A   # 曜日の名前 (Monday, Tuesday, ...)
%a   # 曜日の略名 (Mon, Tue, ...)
%B   # 月の名前 (January, February, ...)
%b   # 月の略名 (Jan, Feb, ...)
%w   # 曜日の数値 (0=日曜日, 6=土曜日)
%j   # 年内の日数 (001-366)
%U   # 週の番号 (日曜始まり)
%W   # 週の番号 (月曜始まり)

Unixタイムスタンプとの相互変換

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 現在のUnixタイムスタンプを取得
date +%s
1767502245

# Unixタイムスタンプから日付に変換
date -d @1767502245
Fri Jan  3 10:30:45 JST 2026

# または
date -d "1767502245 seconds since 1970-01-01" +%Y-%m-%d
2026-01-03

Unixタイムスタンプはプログラム間での時刻交換に便利です。


-dオプションで相対的な日付計算

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 10日後
date -d "+10 days"

# 1ヶ月前
date -d "1 month ago"

# 1年と3ヶ月前
date -d "1 year 3 months ago"

# 明日
date -d "tomorrow"

# 昨日
date -d "yesterday"

# 特定の日付から30日後
date -d "2026-01-01 +30 days"

複雑な日付計算をコマンドラインで簡単に実行できます。


シェルスクリプトでの活用

1
2
3
4
5
6
7
8
9
#!/bin/bash
# ログファイルに日付付きで出力
LOGFILE="/var/log/backup_$(date +%Y%m%d_%H%M%S).log"

# ログメッセージに日時を付加
echo "Backup started at $(date +%Y-%m-%d\ %H:%M:%S)" >> $LOGFILE

# 1週間以上前のログを削除
find /var/log -name "backup_*.log" -mtime +7 -delete

スクリプトでの日付操作が効率化できます。


タイムゾーンの設定

1
2
3
4
5
6
7
# 現在のタイムゾーン確認
date +%Z

# 別のタイムゾーンで表示
TZ=UTC date
TZ=America/New_York date
TZ=Asia/Tokyo date

環境変数TZで一時的にタイムゾーンを変更できます。


実践的な使い方

ログファイルの自動管理

1
2
3
4
5
6
7
#!/bin/bash
# ログファイル名に日付を付ける
LOGFILE="/var/log/myapp_$(date +%Y%m%d).log"
echo "$(date +%Y-%m-%d\ %H:%M:%S) Application started" >> $LOGFILE

# 30日以上前のログを削除
find /var/log -name "myapp_*.log" -mtime +30 -delete

毎日ログファイルを変更し、古いログを自動削除します。


定期バックアップ

1
2
3
4
5
6
7
#!/bin/bash
BACKUP_DIR="/backup"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
tar -czf $BACKUP_DIR/backup_$TIMESTAMP.tar.gz /home/user

# バックアップ成功をログ
echo "$(date): Backup completed: backup_$TIMESTAMP.tar.gz" >> /var/log/backup.log

タイムスタンプ付きバックアップで、複数の世代管理が簡単になります。


ファイル更新日時の確認と比較

1
2
3
4
5
6
7
8
9
#!/bin/bash
# ファイルの更新日時を取得
FILE_DATE=$(stat -c %Y myfile.txt)
CURRENT_DATE=$(date +%s)

# 1日以上前に更新されたか確認
if [ $((CURRENT_DATE - FILE_DATE)) -gt 86400 ]; then
  echo "ファイルが1日以上更新されていません"
fi

ファイルの更新日時とシステム時刻を比較して、処理を分岐させられます。


曜日に応じた処理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/bin/bash
# 曜日に応じた処理
DAYOFWEEK=$(date +%A)

case $DAYOFWEEK in
  Monday)
    echo "週明けです。レポートを確認しましょう"
    ;;
  Friday)
    echo "金曜日です。週末前に確認しましょう"
    ;;
  *)
    echo "通常業務です"
    ;;
esac

曜日に応じて異なる処理を実行できます。


まとめ

dateコマンドのポイント:

  • 現在の日付表示date
  • ISO 8601形式date -I
  • Unixタイムスタンプdate +%s
  • カスタムフォーマットdate +%Y-%m-%d\ %H:%M:%S
  • 相対的な日付計算date -d "+10 days"
  • UTC表示date -u
  • ファイル名に日付埋め込み$(date +%Y%m%d)
  • よく使う組み合わせdate +%Y-%m-%ddate +%sdate -I

dateはシェルスクリプトの必須コマンド。ログ、バックアップ、ファイル管理などで日付を活用することで、自動化がぐっと効率化しますよ!