date – システム時刻の表示・設定・書式化を行う

時刻設定・同期

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, --utcUTC で表示/変換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 で確認してください。

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント