date は現在の日時を表示したり、指定フォーマットで整形して出力するコマンドです。
(管理者権限があれば)システム時刻の設定や、文字列・UNIX時刻(エポック秒)との相互変換にも使います。
実務ではログのタイムスタンプ生成、バックアップ名の付与、時刻のパース/変換に利用します。
構文(Syntax)
# 表示(GNU/Linux 例)
date [OPTION...] [+FORMAT]
# 文字列をパースして出力(GNU)
date -d, --date=STRING [+FORMAT]
# 参照ファイルの時刻を表示(GNU)
date -r, --reference=FILE [+FORMAT]
# ISO 8601 形式で出力(GNU)
date -I[=timespec] [-u]
# システム時刻の設定(要 sudo / 環境依存)
date -s, --set=STRING
# 例: sudo date -s "2025-08-23 20:15:00"
# BSD/macOS での設定(上書き。-j を付けると「設定せず変換のみ」)
date [-j] [-f INPUT_FMT] DATESTR [+OUTPUT_FMT]
# 例: date -j -f "%Y-%m-%d %H:%M:%S" "2025-08-23 20:15:00" "+%s"
- 何も付けずに
dateを実行すると現在時刻を標準出力に表示します。 +FORMATで出力フォーマットを指定(strftime(3)互換の書式指定子)。
主なオプション一覧
| オプション | 説明 | 使用例 |
|---|---|---|
+FORMAT | 出力の書式指定。例: %F(YYYY-MM-DD), %T(HH:MM:SS), %s(エポック秒), %z/%Z(オフセット/タイムゾーン略称) | date "+%F %T %z %Z" |
-u, --utc | UTC で表示/変換 | date -u -Iseconds |
-d, --date=STRING (GNU) | 自然文/特定形式の日時文字列をパースして表示 | date -d "next Fri 18:00" "+%F %T" |
-r, --reference=FILE (GNU) | ファイルの最終更新時刻を表示 | date -r /var/log/syslog "+%F %T" |
-I[=timespec] (GNU) | ISO 8601 で出力(date -I, -Iseconds, -Iminutes など) | date -Iseconds |
-s, --set=STRING (GNU) | システム時刻を設定(sudo 要) | sudo date -s "2025-08-23 20:15:00" |
--debug (GNU) | パース結果などを詳細表示 | date --debug -d "2025-08-23 20:15" |
--help, --version | ヘルプ/バージョン表示 | date --help |
TZ=ZONE(環境変数) | 一時的に別タイムゾーンで表示 | TZ=Asia/Tokyo date -u "+%F %T %Z" |
BSD/macOS: -j | 時刻を変更しない(計算・表示のみ) | date -j -f "%s" 1700000000 "+%F %T %Z" |
BSD/macOS: -f FMT | 入力書式を指定してパース | date -j -f "%Y/%m/%d" "2025/08/23" "+%s" |
OS によりオプションが異なります(GNU/Linux と BSD/macOS、BusyBox で差分あり)。
実行例
現在時刻をわかりやすい書式で表示
説明: 日付・時刻・タイムゾーンをまとめて表示します。
コマンド:
date "+%F %T %z %Z"
出力例:
2025-08-23 14:05:12 +0900 JST
ISO 8601(秒精度)で出力(UTC)
説明: ログやAPIに向く一意で機械可読な形式。
コマンド:
date -u -Iseconds
出力例:
2025-08-23T05:05:12+00:00
文字列をパースして別形式で出す(GNU)
説明: 「来週金曜18時」をパースして標準形式で表示。
コマンド:
date -d "next Friday 18:00" "+%F %T %z"
エポック秒 ↔ 整形の相互変換
説明: 1) 現在のエポック秒を得る、2) 任意のエポック秒を日時へ。
コマンド:
date +%s
date -d @1700000000 "+%F %T %Z" # GNU
# BSD/macOS:
date -r 1700000000 "+%F %T %Z"
ファイルの更新時刻を表示(GNU)
説明: 参照ファイルの mtime を読みやすく出力します。
コマンド:
date -r /etc/passwd "+%F %T %Z"
エラー例:一般ユーザーで時刻設定(GNU)
説明: -s は通常 root 権限が必要。
コマンド:
date -s "2025-08-23 20:15:00"
出力例(例):
date: cannot set date: Operation not permitted
対処: sudo を付ける、または timedatectl など管理ツールを使用。
関連コマンド
timedatectl: systemd 環境での時刻/タイムゾーン/NTP 設定。hwclock: ハードウェアクロック(RTC)の読み書き。tzselect: 対話的にタイムゾーンを選ぶ。touch: ファイルのタイムスタンプを変更。stat: ファイルの詳細(更新時刻など)を表示。
備考
- フォーマット指定子(抜粋):
%F=YYYY-MM-DD,%T=HH:MM:SS,%Y/%m/%d/%H/%M/%S,%s=エポック秒,%N=ナノ秒(GNU),%z/%Z=オフセット/略称,%A/%a=曜日,%B/%b=月名,%%=%。 - ロケールの影響: 月名・曜日名はロケール依存。英語固定にしたい場合は
LC_ALL=C date "+%a %b %e %T %Z %Y"。 - 時刻の手動設定: NTP が有効だとすぐ同期で戻ることがあります。systemd なら
timedatectl set-ntp falseで一時停止できます。 - BSD/GNU 差分: GNU の
-d/-r FILEは便利ですが、BSD のdateは-r <epoch秒>で挙動が異なります。移植性が必要なら OS ごとの使い分けを。 - BusyBox: オプションが絞られます(例:
-Dなど実装固有)。date --helpで確認してください。
参考
- GNU coreutils
dateマニュアル(invocation): https://www.gnu.org/software/coreutils/manual/html_node/date-invocation.html - Linux man-pages(GNU
date(1)): https://man7.org/linux/man-pages/man1/date.1.html strftime(3)書式指定子一覧: https://man7.org/linux/man-pages/man3/strftime.3.html- FreeBSD
date(1)(BSD系の挙動): https://man.freebsd.org/cgi/man.cgi?date(1) - systemd
timedatectl(1)(時刻/タイムゾーン/NTP管理): https://www.freedesktop.org/software/systemd/man/latest/timedatectl.html - BusyBox
date(実装差の確認): https://busybox.net/downloads/BusyBox.html

コメント