date コマンド入門 - 日付の書式・計算・タイムゾーン操作
date コマンドってなに?
date コマンドだよ。実行すると今の日時が出るし、date +%Y%m%d みたいに書けば 20260605 の形に整形してくれる。ファイル名にもそのまま使えるんだ。date は、現在の日時を表示したり、好きな書式に整形したりするコマンドです。ログのタイムスタンプ、バックアップのファイル名、スクリプト内の日付計算など、実務で毎日のように使う定番コマンドです。
一言でいうと
date +書式 で「好きな形の日付文字列」が作れる。
例: date +%Y-%m-%d → 2026-06-05
この記事でわかること
dateで現在の日時を表示し、date +%Fなどで好きな書式に整形できる%Y%m%dなどの 書式指定子 を組み合わせて自由なフォーマットを作れるdate -d "3 days ago"のように 昨日・N日後・来週 などの日付を計算できるdate +%sでエポック秒(Unix 時間)を取得し、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-1. よく使う書式指定子
| 指定子 | 意味 | 例 |
|---|---|---|
%Y |
西暦4桁 | 2026 |
%m |
月(01〜12) | 06 |
%d |
日(01〜31) | 05 |
%H |
時(00〜23) | 15 |
%M |
分(00〜59) | 52 |
%S |
秒(00〜59) | 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(時刻)を覚えておけば、たいていの場面で困りません。
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 をそのまま使わないようにしましょう。一部の環境やファイルシステムでは扱いにくくなります。時刻を入れるなら %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
ログに 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 に指定できる地域名(例: Asia/Tokyo / America/New_York / Europe/London)は、timedatectl list-timezones で一覧を確認できます。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 版です。
ミニ課題:今日の3日後の日付を `YYYY/MM/DD` 形式で表示してみよう
ヒント: -d で日付を計算し、+書式 で形を整えます。
答え:
$ date -d "3 days" "+%Y/%m/%d" 2026/06/08
"3 days" は「今から3日後」という意味です。"+3 days" と書いても同じです。
まとめ
| やること | コマンド |
|---|---|
| 現在の日時を表示 | 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"で日付つきファイルを作る