date コマンド入門 - 日付の書式・計算・タイムゾーン操作
この記事でできるようになること
- `date +書式` で日付や時刻を好きな形に整えられる
- `date -d` で昨日・N 日後などの日付を計算できる
- `date +%s` と `date -d @秒数` でエポック秒と日付を変換できる
前提知識(先に読むと理解しやすい記事)
date コマンドってなに?
date コマンドだよ。打つだけで、今の日時が出るんだ。date +%Y%m%d と書けば 20260605 の形に整えてくれる。ファイル名にもそのまま使えるんだ。date は、現在の日時を表示するコマンドです。好きな書式に整えることもできます。
ログの時刻の記録、バックアップのファイル名、スクリプトの中の日付の計算に使います。仕事の場面で毎日のように出てくるコマンドです。
言葉の整理(先に取りちがえを防ぎます)
- 書式:日付をどの形で出すかの指定です。「フォーマット」も同じものを指します。
- 書式指定子:
%Yのように%ではじまる記号です。年や月など、日付の部品を 1 つずつ表します。 - ロケール:言語と地域の設定です。曜日名などの表示がこれで変わります。
- タイムゾーン:地域ごとの時刻の差です。日本は JST、世界標準は UTC と呼びます。
- エポック秒:1970 年 1 月 1 日からの経過秒数です。「Unix 時間」も同じものを指します。
前提(対象環境)
- OS:Ubuntu / 一般的な Linux
- GNU coreutils の
date(macOS の BSD 版は書き方がちがいます。第 7 章で説明します) - この記事の表示は日本時間(JST)です。タイムゾーンがちがう環境では時刻もずれます
一言でいうと
date +書式 で「好きな形の日付文字列」が作れる。
例: date +%Y-%m-%d → 2026-06-05
この記事でわかること
dateで今の日時を表示できます。date +%Fなどで好きな形に整えられます%Y%m%dなどの 書式指定子 を組み合わせて、自由な形を作れますdate -d "3 days ago"のように、昨日・N 日後・来週 などの日付を計算できますdate +%sでエポック秒を取り出し、date -d @秒数で日付に戻せますTZ='UTC' dateやdate -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
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 のターミナルに入っている date は BSD 版 です。そのため一部のオプションが異なります。
| やりたいこと | 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の基本を手で確かめる。
課題 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 で日付を計算するんですね。%m が月、%M が分。ここは必ず目で確かめます。@ を付けるのも忘れずに。今日の 3 行まとめ
date +%Fで日付、date +%Tで時刻。迷ったらこの 2 つ%mは月、%Mは分。まちがえてもエラーが出ないので目で確かめる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 ステップ
date +%Fで今日の日付を表示するdate -d "tomorrow" +%Fで明日の日付を計算するcp なにか.txt "backup-$(date +%Y%m%d).txt"で日付つきファイルを作る