date コマンド入門 - 日付の書式・計算・タイムゾーン操作

date コマンド入門 - 日付の書式・計算・タイムゾーン操作

この記事でできるようになること

  • `date +書式` で日付や時刻を好きな形に整えられる
  • `date -d` で昨日・N 日後などの日付を計算できる
  • `date +%s` と `date -d @秒数` でエポック秒と日付を変換できる

前提知識(先に読むと理解しやすい記事)

date コマンドってなに?

リナ: ライニー先輩、バックアップのファイル名に「今日の日付」を入れたいです。毎回手で打つしかないのでしょうか。
ライニー先輩: そこで date コマンドだよ。打つだけで、今の日時が出るんだ。
ライニー先輩: date +%Y%m%d と書けば 20260605 の形に整えてくれる。ファイル名にもそのまま使えるんだ。
リナ: コマンド 1 つで日付が作れるんですね。
ライニー先輩: そう。しかも「3 日前」「来週の金曜」のような計算もできる。タイムゾーンの切りかえも同じコマンドでできるよ。

date は、現在の日時を表示するコマンドです。好きな書式に整えることもできます。

ログの時刻の記録、バックアップのファイル名、スクリプトの中の日付の計算に使います。仕事の場面で毎日のように出てくるコマンドです。

言葉の整理(先に取りちがえを防ぎます)

  • 書式:日付をどの形で出すかの指定です。「フォーマット」も同じものを指します。
  • 書式指定子%Y のように % ではじまる記号です。年や月など、日付の部品を 1 つずつ表します。
  • ロケール:言語と地域の設定です。曜日名などの表示がこれで変わります。
  • タイムゾーン:地域ごとの時刻の差です。日本は JST、世界標準は UTC と呼びます。
  • エポック秒:1970 年 1 月 1 日からの経過秒数です。「Unix 時間」も同じものを指します。

前提(対象環境)

  • OS:Ubuntu / 一般的な Linux
  • GNU coreutils の date(macOS の BSD 版は書き方がちがいます。第 7 章で説明します)
  • この記事の表示は日本時間(JST)です。タイムゾーンがちがう環境では時刻もずれます

一言でいうと

date +書式 で「好きな形の日付文字列」が作れる。

例: date +%Y-%m-%d2026-06-05

この記事でわかること

  • date で今の日時を表示できます。date +%F などで好きな形に整えられます
  • %Y %m %d などの 書式指定子 を組み合わせて、自由な形を作れます
  • date -d "3 days ago" のように、昨日・N 日後・来週 などの日付を計算できます
  • date +%s でエポック秒を取り出し、date -d @秒数 で日付に戻せます
  • TZ='UTC' datedate -uタイムゾーンを切りかえ られます
  • Linux(GNU date)と macOS(BSD date)で書き方がちがう点に気をつけられます

1. まずは現在時刻を表示する

結論: 引数なしの date で現在の日時が出る。表示形式を変えたいときは date +書式 を使う。

オプションを何も付けずに実行すると、今の日時が出ます。

$ date
2026年  6月  5日 金曜日 15:52:59 JST

表示される文字列は、システムのロケールとタイムゾーンの設定で変わります。曜日や JST の部分がその例です。

英語環境なら Fri Jun 5 15:52:59 JST 2026 のように出ます。

「年月日だけ欲しい」「時刻だけ欲しい」というときは、次の章の書式指定を使います。

2. 書式を自由に変える(%Y %m %d…)

結論: date + の後ろに %Y(年)%m(月)%d(日)などの記号を並べると、好きな形に整形できる。

+ の後ろに 書式指定子 を書きます。すると、その形で日付が出ます。

$ date +%Y-%m-%d
2026-06-05
$ date "+%Y/%m/%d %H:%M:%S"
2026/06/05 15:52:59

書式の中にスペースを入れたいときは、全体を "..."(ダブルクォート)で囲みます。

囲まないと、シェル入力したコマンドを解釈してコンピュータに実行させる対話プログラム。はスペースの位置で 2 つに区切ります。すると date は 2 つ目を余分な引数と見なし、エラーになります。

$ date +%Y-%m-%d %H:%M:%S
date: extra operand '%H:%M:%S'
Try 'date --help' for more information.

2-1. よく使う書式指定子

指定子 意味
%Y 西暦4桁 2026
%m 月(01〜12) 06
%d 日(01〜31) 05
%H 時(00〜23) 15
%M 分(00〜59) 52
%S 秒(00〜60) 59
%A 曜日(フル) Friday
%a 曜日(短縮) Fri
%j 年間通算日 156
%s エポック秒 1780642379
リナ: 指定子がたくさんあって、覚えられる気がしません。
ライニー先輩: 全部覚えなくて大丈夫だよ。よく使う組み合わせには ショートカット が用意されているんだ。

2-2. 便利なショートカット

$ date +%F
2026-06-05
$ date +%T
15:52:59
  • %F%Y-%m-%d と同じ(ISO 8601 形式の日付)
  • %T%H:%M:%S と同じ(時刻)

迷ったら %F(日付)と %T(時刻)を覚えてください。たいていの場面はこの 2 つで足ります。

2-3. リナの失敗:%m%M を取りちがえる

リナ: 先輩、年月日を出したのに、月のところが 52 になっています。そんな月はないですよね。
$ date +%Y-%M-%d
2026-52-05
リナ: 日付が壊れてしまったのでしょうか。
ライニー先輩: 壊れていないよ。よく見て。大文字の %M を書いているね。
ライニー先輩: 小文字の %m が月、大文字の %M が分なんだ。今が 15 時 52 分だから、月の位置に 52 が入ったんだよ。
リナ: えっ、大文字と小文字で意味がちがうんですか。びっくりしました。
ライニー先輩: そう。日付は小文字、時こくは大文字と覚えるといい。%Y だけは年なのに大文字で、そこだけ例外だね。
リナ: 数字が出ていたので気づきませんでした。エラーにならないぶん、こわいですね。
ライニー先輩: そのとおり。だから書式を変えたら、まず画面に出して見てみる。これがいちばん確実な防ぎ方だよ。

%m(月)と %M(分)、%d(日)と %D(月/日/年)は取りちがえやすい組み合わせです。まちがえてもエラーにはならず、それらしい数字が出ます。だから目で確かめる習慣が大切です。

3. ファイル名・ログに使うテンプレート

結論: $(date +%Y%m%d) をファイル名に埋め込むと、日付つきのファイルが自動で作れる。

$(...) と書くと、コマンドの結果を文字列に埋めこめます。これをコマンド置換と呼びます。バックアップで定番のテクニックです。

$ cp data.db "backup-$(date +%Y%m%d).db"

これで backup-20260605.db という名前のファイルができます。

$ echo "[$(date '+%Y-%m-%d %H:%M:%S')] 処理を開始" >> app.log

ログに自分で時刻を付けたいときの形です。出力の例を見てみましょう。

[2026-06-05 15:52:59] 処理を開始

ファイル名に %T をそのまま使うのは避けてください。%T にはコロン(:)が入ります。環境やファイルシステムによっては、コロンを含む名前があつかいにくくなります。

ファイル名に時刻を入れるなら %H%M%S のように区切りなしで書くのが無難です。

4. 日付を計算する(昨日・3日後・N日前)

結論: date -d "文字列" を使うと、「昨日」「3日後」「来週の金曜」などを英語で指定して計算できる。

-d(または --date)オプションに、計算したい日付を 英語の表現 で渡します。

$ date -d "yesterday" +%F
2026-06-04
$ date -d "3 days ago" +%F
2026-06-02
$ date -d "next friday" +%F
2026-06-12

基準になる日付を自分で決めて計算することもできます。

$ date -d "2025-01-01 +30 days" +%F
2025-01-31
リナ: 「30 日後」を自分で計算すると、月をまたぐところで必ずまちがえます。
ライニー先輩: そこを date が正確にやってくれる。月末の日数も、うるう年も計算に入っているんだ。
ライニー先輩: 手で数えるより、ずっと安全だよ。

よく使う指定の例

  • tomorrow / yesterday(明日 / 昨日)
  • 3 days ago / 2 weeks / 1 month(N日前 / N週後 / Nか月後)
  • next monday / last sunday(次の月曜 / 前の日曜)

これらの 相対日付の計算は GNU date(Linux)の機能 です。macOS では構文がちがうため動きません。くわしくは 7 章 で説明します。

5. エポック秒(Unix 時間)との変換

結論: date +%s で「1970年からの経過秒数」を取得でき、date -d @秒数 で日付に戻せる。

エポック秒(Unix 時間) とは、1970 年 1 月 1 日 00:00:00 UTC からの経過秒数です。

プログラムやログでは、この形で時刻を残すことがよくあります。地域や書き方のちがいに左右されないからです。

$ date +%s
1780642379

エポック秒を人が読める日付に戻すときは、数字の前に @ を付けます。

$ date -d @1700000000 "+%Y-%m-%d %H:%M:%S"
2023-11-15 07:13:20

表示される日時は、パソコンのタイムゾーン設定で変わります。上の出力は日本時間(JST)のものです。

UTC の環境では 9 時間前になり、2023-11-14 22:13:20 と出ます。Docker コンテナやクラウドのサーバーは UTC のことが多い点に注意してください。

どの環境でも同じ結果にしたいときは TZ を指定します。

$ TZ='Asia/Tokyo' date -d @1700000000 "+%Y-%m-%d %H:%M:%S"

ログに 1700000000 のような数字だけが記録されていることがあります。そのままでは読めません。date -d @その数字 を使えば、すぐ日付に変換できます。

6. タイムゾーンを切り替える(TZ / -u)

結論: date -u で UTC、TZ='地域名' date で任意のタイムゾーンの時刻を表示できる。

-u を付けると UTC(協定世界時) で表示されます。

$ date -u "+%Y-%m-%d %H:%M %Z"
2026-06-05 06:52 UTC

特定の地域の時刻を見たいときは、TZ という環境変数シェルやプログラムが参照する、名前と値の組み合わせで管理される設定値。をその場で指定します。

$ TZ='America/New_York' date "+%Y-%m-%d %H:%M %Z"
2026-06-05 02:52 EDT
$ TZ='Asia/Tokyo' date "+%Y-%m-%d %H:%M %Z"
2026-06-05 15:52 JST
リナ: TZ=... をコマンドの前に書くと、その 1 回だけタイムゾーンが変わるのですか。
ライニー先輩: そう。TZ='地域名' date の形にすると、その date を実行する間だけ有効になるんだ。
ライニー先輩: システム全体の設定は変わらない。だから安心して試せるよ。
リナ: 海外のサーバーの時刻を確かめたいときに便利ですね。

TZ に書ける地域名は timedatectl list-timezones で一覧を見られます。Asia/Tokyo America/New_York Europe/London などが例です。

TZ は環境変数です。環境変数の使い方 も読むと理解が深まります。

7. macOS(BSD date)との違いに注意

結論: Linux の date は GNU 版。macOS の date は BSD 版で、日付計算やエポック変換の構文が違う。

この記事のコマンドは Ubuntu などの Linux(GNU coreutils の date) を前提にしています。

macOS のターミナルに入っている dateBSD 版 です。そのため一部のオプションが異なります。

やりたいこと Linux(GNU) macOS(BSD)
3日前を計算 date -d "3 days ago" date -v-3d
エポック秒→日付 date -d @1700000000 date -r 1700000000
文字列から日付を解釈 date -d "2025-01-01" date -j -f "%Y-%m-%d" "2025-01-01"

ネットで見つけた date -d ... が macOS で illegal option と言われることがあります。その場合は BSD 版を使っている可能性が高いです。

date --version を実行してください。GNU coreutils と出れば GNU 版です。

8. ミニ課題:実際にやってみよう

結論: 書式の組み立て・日付の計算・エポック秒の変換の 3 問で、date の基本を手で確かめる。

リナ: 知識は入りました。手を動かして確かめたいです。
ライニー先輩: いいね、3 問用意したよ。ターミナルで試してみて。

課題 1:今日の日付を 2026/06/05 の形(スラッシュ区切り)で表示しよう。

ヒント 1(方向づけ)を見る

+ の後ろに、年・月・日の記号をスラッシュでつないで並べます。スペースは入りません。

ヒント 2(コマンド名)を見る

使うのは date です。年・月・日の記号は第 2 章の表にあります。月が小文字である点に注意してください。

答えを見る
$ date +%Y/%m/%d
2026/06/05

課題 2:今日の 3 日後の日付を YYYY/MM/DD の形で表示しよう。

ヒント 1(方向づけ)を見る

2 つのことを同時に行います。日付を計算するオプションと、形を整える書式の両方を書きます。

ヒント 2(コマンド名)を見る

使うのは date です。日付を計算するオプションは第 4 章、書式の書き方は第 2 章にあります。

答えを見る
$ date -d "3 days" "+%Y/%m/%d"
2026/06/08

"3 days" は「今から 3 日後」という意味です。"+3 days" と書いても同じ結果になります。

課題 3:エポック秒 1700000000 を、日本時間で YYYY-MM-DD の形の日付に戻そう。

ヒント 1(方向づけ)を見る

数字をそのまま渡すと日付として読まれません。エポック秒だと伝える印を、数字の前に付けます。あわせて、タイムゾーンを日本時間に固定します。

ヒント 2(コマンド名)を見る

使うのは date です。エポック秒を渡す印は第 5 章、タイムゾーンの指定は第 6 章にあります。

答えを見る
$ TZ='Asia/Tokyo' date -d @1700000000 +%F
2023-11-15

%F%Y-%m-%d と同じ意味です。TZ を付けたのは、どの環境でも同じ日付になるようにするためです。TZ なしで実行すると、UTC の環境では 2023-11-14 になります。

9. 振り返り

リナ: 整理します。date +書式 で形を決めて、date -d で日付を計算するんですね。
ライニー先輩: そのとおり。この 2 つは同時に使えるから、計算した結果をそのまま好きな形で出せるよ。
リナ: 書式では %m が月、%M が分。ここは必ず目で確かめます。
ライニー先輩: 完璧だね。エポック秒に戻すときは @ を付けるのも忘れずに。

今日の 3 行まとめ

  1. date +%F で日付、date +%T で時刻。迷ったらこの 2 つ
  2. %m は月、%M は分。まちがえてもエラーが出ないので目で確かめる
  3. date -d "3 days ago" で日付を計算し、date -d @秒数 でエポック秒を日付に戻す

まとめ

やること コマンド
現在の日時を表示 date
年月日だけ表示 date +%F(= date +%Y-%m-%d
時刻だけ表示 date +%T
ファイル名用の日付 date +%Y%m%d
日付を計算する date -d "3 days ago" +%F
エポック秒を取得 date +%s
エポック秒を日付に戻す date -d @1700000000
UTC で表示 date -u
タイムゾーンを指定 TZ='Asia/Tokyo' date

今すぐ試せる 3 ステップ

  1. date +%F で今日の日付を表示する
  2. date -d "tomorrow" +%F で明日の日付を計算する
  3. cp なにか.txt "backup-$(date +%Y%m%d).txt" で日付つきファイルを作る

次に読む

この記事を共有

次の一手