- 技術 💻
dateコマンドのフォーマット一覧と日付計算|月末・macOS差異もコピペで
dateコマンドとは、現在や指定した日時を、+%Y-%m-%d のような書式で好きな形に表示するコマンドです。 GNU 版(Linux)では -d で「3日前」「来月の1日」などの日付計算もでき、シェルスクリプトのログ出力やバックアップのファイル名づくりに欠かせません。
この記事では、書式指定子をすべて出力例つきの一覧表にまとめ、GNU coreutils 9.4(Ubuntu)で実行した結果を載せています。月末・前月末・月初の求め方、「1月31日の1か月後」が3月3日になる落とし穴の再現と直し方、12:00 -3 hours が意図しない時刻になる理由、TZ 指定とエポック秒の変換、ISO 8601/RFC 5322 形式、そして macOS(BSD 版)の -v・-j -f との対照表まで扱います。タイムゾーンをシステムでどう扱うかという設計の話は、別記事「タイムゾーン設計」にまとめています。
dateコマンドの書式指定子早見表
よく使うのは %Y(年)%m(月)%d(日)%H(時)%M(分)%S(秒)と、まとめ書きの %F(年-月-日)%T(時:分:秒)です。 次の出力例は TZ=Asia/Tokyo、LC_ALL=C、日時 2026-10-02 09:05:07.123456789 +0900 で実行した結果です。
T='2026-10-02 09:05:07.123456789 +0900'
for f in %Y %m %d %H %M %S %N %s %j %u %V %Z %z %:z %F %T; do
printf '%-6s => [%s]\n' "$f" "$(LC_ALL=C TZ=Asia/Tokyo date -d "$T" +"$f")"
done
| 指定子 | 意味 | 出力例 |
|---|---|---|
%Y |
西暦4桁 | 2026 |
%y |
西暦下2桁 | 26 |
%C |
世紀(上2桁) | 20 |
%m |
月(01〜12) | 10 |
%d |
日(01〜31) | 02 |
%e |
日(空白埋め) | 2 |
%H |
時(00〜23) | 09 |
%I |
時(01〜12) | 09 |
%k |
時(空白埋め、0〜23) | 9 |
%l |
時(空白埋め、1〜12) | 9 |
%M |
分 | 05 |
%S |
秒 | 07 |
%N |
ナノ秒(9桁) | 123456789 |
%3N |
ミリ秒(3桁) | 123 |
%6N |
マイクロ秒(6桁) | 123456 |
%p / %P |
午前・午後(大文字/小文字) | AM / am |
%s |
エポック秒(1970-01-01 UTC からの秒数) | 1790899507 |
%j |
年内の通算日(001〜366) | 275 |
%u |
曜日番号(月=1〜日=7) | 5 |
%w |
曜日番号(日=0〜土=6) | 5 |
%a / %A |
曜日名(略称/正式) | Fri / Friday |
%b / %B |
月名(略称/正式) | Oct / October |
%U |
週番号(日曜始まり) | 39 |
%W |
週番号(月曜始まり) | 39 |
%V |
ISO 8601 週番号 | 40 |
%G / %g |
ISO 8601 週の年(4桁/2桁) | 2026 / 26 |
%Z |
タイムゾーン略称 | JST |
%z |
UTC からの差 | +0900 |
%:z |
UTC からの差(コロンつき) | +09:00 |
%::z |
秒まで | +09:00:00 |
%:::z |
必要な桁だけ | +09 |
%F |
%Y-%m-%d |
2026-10-02 |
%T |
%H:%M:%S |
09:05:07 |
%D |
%m/%d/%y |
10/02/26 |
%R |
%H:%M |
09:05 |
%r |
12時間制の時刻 | 09:05:07 AM |
%c |
ロケールの日時 | Fri Oct 2 09:05:07 2026 |
%x / %X |
ロケールの日付/時刻 | 10/02/26 / 09:05:07 |
%n / %t |
改行/タブ | ― |
%% |
% そのもの |
% |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「dateコマンドのフォーマット一覧と日付計算|月末・macOS差異もコピペで」
桁埋め・大文字化のフラグ
% の直後にフラグを付けると、ゼロ埋めをやめたり大文字にしたりできます。
| 書き方 | 意味 | 出力例(10月2日金曜) |
|---|---|---|
%-d |
ゼロ埋めしない | 2 |
%_m |
空白で埋める | 10(1桁なら 1) |
%05d |
幅5でゼロ埋め | 00002 |
%^a |
大文字にする | FRI |
%#Z |
大文字小文字を反転 | jst |
日本語で表示する
LC_TIME=ja_JP.UTF-8 を指定すると、曜日や %c が日本語になります(locale -a に ja_JP.utf8 がある環境)。
$ LC_TIME=ja_JP.UTF-8 date -d '2026-10-02 09:05:07' '+%Y年%m月%d日(%a) %H時%M分 / %c / %x'
2026年10月02日(金) 09時05分 / 2026年10月02日 09時05分07秒 / 2026年10月02日
$ LC_ALL=ja_JP.UTF-8 date -d '2026-10-02 09:05:07'
2026年 10月 2日 金曜日 09:05:07 JST
スクリプトでは LC_ALL=C か書式の明示で、環境に左右されない出力にすると、ログの比較や並べ替えが安定します。
dateのオプション早見表(GNU版)
| オプション | 働き | 例 |
|---|---|---|
+書式 |
書式を指定して表示 | date +%F |
-d 文字列 |
指定した日時(相対表現も可)を使う | date -d '1 day ago' |
-u |
UTC で表示(入力も UTC とみなす) | date -u |
-r ファイル |
ファイルの更新日時を表示 | date -r app.log |
-I[単位] |
ISO 8601 形式 | date -Iseconds |
-R |
RFC 5322(メール)形式 | date -R |
--rfc-3339=単位 |
RFC 3339 形式 | date --rfc-3339=seconds |
-f ファイル |
ファイルの各行を -d として処理 |
date -f dates.txt +%F |
-s 文字列 |
システム時刻を設定(root) | 通常は timedatectl を使う |
--debug |
解釈の過程を表示 | 日付計算の確認に |
-d で日付を計算する(〇日前・〇日後)
-d に「基準の日時」と「相対表現」を書くと、その計算結果を表示できます。 基準を省くと現在時刻が基準になります。結果はすべて TZ=Asia/Tokyo で実行したものです。
for e in "2026-10-02 1 day ago" "2026-10-02 yesterday" "2026-10-02 tomorrow" \
"2026-10-02 +3 days" "2026-10-02 -2 weeks" "2026-10-02 1 month ago" \
"2026-10-02 +1 year" "2026-10-02 12:00 3 hours ago" "2026-10-02 09:00 90 minutes"; do
printf '%-32s -> %s\n' "$e" "$(date -d "$e" '+%F %T %a')"
done
2026-10-02 1 day ago -> 2026-10-01 00:00:00 Thu
2026-10-02 yesterday -> 2026-10-01 00:00:00 Thu
2026-10-02 tomorrow -> 2026-10-03 00:00:00 Sat
2026-10-02 +3 days -> 2026-10-05 00:00:00 Mon
2026-10-02 -2 weeks -> 2026-09-18 00:00:00 Fri
2026-10-02 1 month ago -> 2026-09-02 00:00:00 Wed
2026-10-02 +1 year -> 2027-10-02 00:00:00 Sat
2026-10-02 12:00 3 hours ago -> 2026-10-02 09:00:00 Fri
2026-10-02 09:00 90 minutes -> 2026-10-02 10:30:00 Fri
| やりたいこと | 書き方 |
|---|---|
| 昨日 | date -d yesterday +%F / date -d '1 day ago' +%F |
| 明日 | date -d tomorrow +%F |
| N日後/N日前 | date -d '+7 days' +%F / date -d '7 days ago' +%F |
| N週間後 | date -d '+2 weeks' +%F |
| N時間前 | date -d '3 hours ago' '+%F %T' |
| 指定日から計算 | date -d '2026-10-02 +10 days' +%F |
| 次の月曜日(今日基準) | date -d 'next monday' +%F |
時刻のあとの「-3 hours」はタイムゾーンとして読まれる
12:00 -3 hours のように時刻の直後に + - つきの数字を書くと、GNU date は「UTC-3 のタイムゾーン」と解釈します。 --debug で確かめました。
$ date --debug -d '2026-10-02 12:00 -3 hours'
date: parsed date part: (Y-M-D) 2026-10-02
date: parsed time part: 12:00:00 UTC-03
date: parsed relative part: +1 hour(s)
...
date: final: (Y-M-D) 2026-10-02 16:00:00 (UTC)
-3 がタイムゾーン、hours が「+1時間」として読まれ、結果は日本時間で翌日の 01:00 になりました。 09:00 +90 minutes も同じ理由で invalid date になります。
| 直す前 | 結果 | 直した後 | 結果 |
|---|---|---|---|
2026-10-02 12:00 -3 hours |
2026-10-03 01:00:00 |
2026-10-02 12:00 3 hours ago |
2026-10-02 09:00:00 |
2026-10-02 09:00 +90 minutes |
invalid date |
2026-10-02 09:00 90 minutes |
2026-10-02 10:30:00 |
| ― | ― | 2026-10-02 12:00 +0900 -3 hours |
2026-10-02 09:00:00 |
時刻のあとは ago を使うか、+0900 のようにタイムゾーンを先に書くと意図どおりに計算できます。迷ったら --debug で解釈を確認します。
曜日名は基準日と組み合わせない
2026-10-02 next monday は 2026-10-02(金曜)のまま返りました。基準日からの「次の月曜」は、%u(月=1〜日=7)で日数を計算すると確実です。
d=2026-10-02
echo "今週の月曜: $(date -d "$d -$(( $(date -d $d +%u) - 1 )) days" +%F)"
echo "次の月曜: $(date -d "$d +$(( 8 - $(date -d $d +%u) )) days" +%F)"
今週の月曜: 2026-09-28
次の月曜: 2026-10-05
月末・前月末・月初を求める
月末は「その月の1日から1か月進めて1日戻す」で求めます。 月の日数(28〜31日)を気にせずに済みます。
base=2026-02-15
first=$(date -d "$base" +%Y-%m-01)
echo "月初: $first"
echo "月末: $(date -d "$first +1 month -1 day" +%F)"
echo "前月末: $(date -d "$first -1 day" +%F)"
echo "前月初: $(date -d "$first -1 month" +%F)"
echo "翌月初: $(date -d "$first +1 month" +%F)"
月初: 2026-02-01
月末: 2026-02-28
前月末: 2026-01-31
前月初: 2026-01-01
翌月初: 2026-03-01
うるう年や30日の月でも確かめました。
for m in 2024-02 2026-02 2026-04 2026-12; do
echo "$m 末: $(date -d "$m-01 +1 month -1 day" +%F)"
done
2024-02 末: 2024-02-29
2026-02 末: 2026-02-28
2026-04 末: 2026-04-30
2026-12 末: 2026-12-31
| 求めたいもの | コピペ用(d は基準日) |
|---|---|
| 月初 | date -d "$d" +%Y-%m-01 |
| 月末 | date -d "$(date -d "$d" +%Y-%m-01) +1 month -1 day" +%F |
| 前月末 | date -d "$(date -d "$d" +%Y-%m-01) -1 day" +%F |
| 前月初 | date -d "$(date -d "$d" +%Y-%m-01) -1 month" +%F |
| 翌月初 | date -d "$(date -d "$d" +%Y-%m-01) +1 month" +%F |
| 前月(年月だけ) | date -d "$(date -d "$d" +%Y-%m-15) -1 month" +%Y-%m |
| 今月の最初の平日 | 1日から %u が 6・7 の間は1日ずつ進める |
1月31日の1か月後は3月3日になる
GNU date の +1 month は「月の数字だけを1つ進め、存在しない日はあふれた分だけ翌月に繰り越す」動きをします。 月末日を基準にすると、次のようになります。
for e in "2026-01-31 +1 month" "2026-01-30 +1 month" "2026-03-31 -1 month" \
"2026-05-31 +1 month" "2024-01-31 +1 month" "2024-02-29 +1 year"; do
printf '%-22s -> %s\n' "$e" "$(date -d "$e" +%F)"
done
2026-01-31 +1 month -> 2026-03-03
2026-01-30 +1 month -> 2026-03-02
2026-03-31 -1 month -> 2026-03-03
2026-05-31 +1 month -> 2026-07-01
2024-01-31 +1 month -> 2024-03-02
2024-02-29 +1 year -> 2025-03-01
「2026-02-31」という日付は無いので、2月28日から3日あふれて3月3日になります。 3月31日の1か月前も「2月31日」となり、同じく3月3日になります。
直し方は、日にちを月の途中(1日や15日)に置き換えてから月を動かすことです。
$ date -d "$(date -d 2026-01-31 +%Y-%m-15) +1 month" +%Y-%m
2026-02
| 目的 | 直す前 | 直した後 |
|---|---|---|
| 翌月の年月 | date -d "$d +1 month" +%Y-%m |
date -d "$(date -d "$d" +%Y-%m-15) +1 month" +%Y-%m |
| 前月の年月 | date -d "$d -1 month" +%Y-%m |
date -d "$(date -d "$d" +%Y-%m-15) -1 month" +%Y-%m |
| 翌月の同日(無ければ月末) | +1 month |
翌月末を求め、日にちと比べて小さい方を使う |
2つの日付の差(日数)
$ echo $(( ( $(date -d 2026-12-25 +%s) - $(date -d 2026-10-02 +%s) ) / 86400 ))
84
エポック秒に変えて引き算し、86400(1日の秒数)で割ります。 夏時間がある地域では1日が86400秒でない日があるので、TZ=UTC を付けて計算すると安定します。
存在しない日付と入力の形
$ date -d 2026-02-30
date: invalid date '2026-02-30'
$ echo $?
1
存在しない日付は終了ステータス1になるので、入力チェックにも使えます(date -d "$d" >/dev/null 2>&1 || echo "日付が不正です")。
| 入力 | 結果(+%F) |
注意 |
|---|---|---|
2026-10-02 |
2026-10-02 |
推奨 |
2026/10/02 |
2026-10-02 |
読める |
20261002 |
2026-10-02 |
読める |
10/02/2026 |
2026-10-02 |
月/日/年として読まれる |
02/10/2026 |
2026-02-10 |
日/月ではなく月/日 |
スラッシュ区切りは「月/日/年」として読まれるので、年-月-日 で渡すのが確実です。
TZでタイムゾーンを指定する
TZ=タイムゾーン名 date で、そのコマンドだけ表示のタイムゾーンを切り替えられます。 入力に +0900 を付けると、入力側のタイムゾーンも固定できます。
$ TZ=UTC date -d '2026-10-02 09:00 +0900' '+%F %T %Z'
2026-10-02 00:00:00 UTC
$ date -u -d '2026-10-02 09:00 +0900' '+%F %T %Z'
2026-10-02 00:00:00 UTC
$ TZ=America/New_York date -d '2026-10-02 09:00 +0900' '+%F %T %Z %:z'
2026-10-01 20:00:00 EDT -04:00
$ TZ=Europe/London date -d '2026-10-02 09:00 +0900' '+%F %T %Z'
2026-10-02 01:00:00 BST
$ TZ=Asia/Tokyo date -d 'TZ="UTC" 2026-10-02 00:00' '+%F %T %Z'
2026-10-02 09:00:00 JST
| やりたいこと | 書き方 |
|---|---|
| 日本時間で表示 | TZ=Asia/Tokyo date |
| UTC で表示 | date -u または TZ=UTC date |
| UTC の時刻を日本時間に | TZ=Asia/Tokyo date -d 'TZ="UTC" 2026-10-02 00:00' |
| 日本時間を UTC に | date -u -d '2026-10-02 09:00 +0900' |
入力の末尾 Z を UTC として読む |
date -d '2026-10-02T00:00:00Z' |
-u は入力も UTC とみなす点に注意します。date -u -d '2026-10-02 09:05:07' -Iseconds は 2026-10-02T09:05:07+00:00 となり、日本時間の 9時ではなく UTC の 9時として扱われます。
エポック秒と日時を相互に変換する
日時からエポック秒は +%s、エポック秒から日時は -d @秒数 です。
$ TZ=Asia/Tokyo date -d '2026-10-02 09:00:00' +%s
1790899200
$ TZ=Asia/Tokyo date -d @1790899200 '+%F %T %Z'
2026-10-02 09:00:00 JST
$ TZ=UTC date -d @0 '+%F %T %Z'
1970-01-01 00:00:00 UTC
$ TZ=Asia/Tokyo date -d @1790899200.5 '+%T.%3N'
09:00:00.500
| やりたいこと | 書き方 |
|---|---|
| 現在のエポック秒 | date +%s |
| ミリ秒のエポック | date +%s%3N(13桁) |
| エポック秒 → 日時 | date -d @1790899200 '+%F %T' |
| 処理時間の計測(ミリ秒) | s=$(date +%s%N); ...; e=$(date +%s%N); echo $(( (e-s)/1000000 )) |
| bash だけで現在秒 | echo "$EPOCHSECONDS"(bash 5.0 以降) |
sleep 0.2 を挟んで処理時間を測ると elapsed_ms=204 と表示されました。
ISO 8601・RFC 3339・RFC 5322 で出力する
API やログで標準形式が必要なときは、-I(ISO 8601)や -R(RFC 5322)を使うと書式を覚えなくて済みます。
d='2026-10-02 09:05:07.123456789'
for o in -I -Ihours -Iminutes -Iseconds -Ins -R --rfc-3339=date --rfc-3339=seconds --rfc-3339=ns; do
printf '%-20s %s\n' "$o" "$(TZ=Asia/Tokyo date -d "$d" $o)"
done
-I 2026-10-02
-Ihours 2026-10-02T09+09:00
-Iminutes 2026-10-02T09:05+09:00
-Iseconds 2026-10-02T09:05:07+09:00
-Ins 2026-10-02T09:05:07,123456789+09:00
-R Fri, 02 Oct 2026 09:05:07 +0900
--rfc-3339=date 2026-10-02
--rfc-3339=seconds 2026-10-02 09:05:07+09:00
--rfc-3339=ns 2026-10-02 09:05:07.123456789+09:00
| 形式 | オプション | 同じ結果の書式指定 | 用途 |
|---|---|---|---|
| ISO 8601(秒) | -Iseconds |
+%FT%T%:z |
API・JSON |
| ISO 8601(UTC、Z付き) | ― | -u +%FT%TZ |
ログ・クラウドサービス |
| RFC 3339 | --rfc-3339=seconds |
'+%F %T%:z' |
日付と時刻の間が空白 |
| RFC 5322(メール) | -R / --rfc-email |
'+%a, %d %b %Y %T %z' |
メールヘッダー |
-Ins は小数点がカンマ(,)になるので、ドット区切りが必要なら +%FT%T.%N%:z と書式で指定します。
ログやバックアップのファイル名を作る定番例
ファイル名には空白やコロンを含めず、%Y%m%d_%H%M%S か %F を使うと、並べ替えたときに日時順になります。
now='2026-10-02 09:05:07'
echo "backup_$(date -d "$now" +%Y%m%d_%H%M%S).tar.gz"
echo "app-$(date -d "$now" +%F).log"
echo "[$(date -d "$now" '+%F %T')] INFO start"
backup_20261002_090507.tar.gz
app-2026-10-02.log
[2026-10-02 09:05:07] INFO start
実際のスクリプトでは -d "$now" を外して現在時刻を使います。
#!/usr/bin/env bash
set -euo pipefail
ts=$(date +%Y%m%d_%H%M%S) # 1回だけ取得して使い回す
log() { printf '[%s] %s\n' "$(date '+%F %T')" "$*"; }
log "バックアップ開始"
tar czf "backup_${ts}.tar.gz" ./data
log "完了: backup_${ts}.tar.gz"
# 7日より前の日付(8桁)を作る
old=$(date -d '7 days ago' +%Y%m%d)
echo "削除対象の基準日: $old"
| ポイント | 理由 |
|---|---|
| 時刻は変数に1回だけ入れる | 処理の途中で日付が変わっても同じ名前を使える |
$(date ...) で代入 |
バッククォートより入れ子にしやすい |
| 年月日を別々の変数に | read y m d <<< "$(date '+%Y %m %d')" |
| bash だけで書式化 | printf -v t '%(%F %T)T' "$ts"(エポック秒から) |
| ゼロ埋めの数値を計算に使う | $((10#$m)) で10進数として扱う |
$ read y m d <<< "$(date -d '2026-10-02' '+%Y %m %d')"; echo "$y/$m/$d"
2026/10/02
$ printf -v t '%(%F %T)T' 1790899507; echo "$t"
2026-10-02 09:05:07
期間の日付を1日ずつ回す
d=2026-09-28
while [[ $d < 2026-10-03 ]]; do
echo -n "$d "
d=$(date -d "$d +1 day" +%F)
done
echo
2026-09-28 2026-09-29 2026-09-30 2026-10-01 2026-10-02
%F 形式は文字列の大小がそのまま日付の前後になるので、[[ $d < 終了日 ]] で比較できます。
年をまたぐ週番号
$ date -d 2026-01-01 '+%G-W%V-%u / %Y %U %W'
2026-W01-4 / 2026 00 00
$ date -d 2027-01-01 '+%G-W%V / %Y'
2026-W53 / 2027
ISO 週番号(%V)を使うときは、年も %Y ではなく %G を使います。 2027年1月1日は ISO 週では「2026年の第53週」に属するためです。
GNU dateとmacOS(BSD版)dateの対照表
macOS の date は BSD 版で、日付計算は -d ではなく -v、文字列からの読み込みは -j -f を使います。 この章は実行しておらず、FreeBSD の公式マニュアル(date(1))で確認した内容です。macOS ではバージョンにより対応オプションが異なるため、man date で手元の版を確認してください。
| やりたいこと | GNU(Linux) | BSD(macOS・FreeBSD) |
|---|---|---|
| 書式指定で表示 | date +%F |
date +%F(同じ) |
| 昨日 | date -d yesterday +%F |
date -v-1d +%F |
| 1か月後 | date -d '+1 month' +%F |
date -v+1m +%F |
| 3時間前 | date -d '3 hours ago' |
date -v-3H |
| 指定日の書式変換 | date -d 2026-10-02 +%Y%m%d |
date -j -f '%Y-%m-%d' 2026-10-02 +%Y%m%d |
| 指定日から計算 | date -d '2026-10-02 +3 days' +%F |
date -j -v+3d -f '%Y-%m-%d' 2026-10-02 +%F |
| 今月末 | date -d "$(date +%Y-%m-01) +1 month -1 day" +%F |
date -v1d -v+1m -v-1d +%F |
| エポック秒 → 日時 | date -d @1790899200 |
date -r 1790899200 |
| ファイルの更新日時 | date -r file |
date -r file(同じ) |
| UTC 表示 | date -u |
date -u(同じ) |
| ISO 8601 | date -Iseconds |
date -Iseconds(FreeBSD の man に記載) |
| RFC 5322 | date -R |
date -R(RFC 2822 形式と記載) |
ナノ秒 %N |
対応 | FreeBSD の man に %nN の記載あり。macOS は版で異なる |
BSD の -v の書き方 |
意味 |
|---|---|
-v+1d / -v-1d |
1日進める/戻す |
-v+1m / -v-1m |
1か月進める/戻す |
-v1d |
日を1日にする(+ - なしは「設定」) |
-v-fri |
直前の金曜日に戻す |
| 単位 | y 年、m 月、w 週、d 日、H 時、M 分、S 秒 |
-j は「時刻を設定しない」という意味で、-f で読み込んだ日時を表示だけするときに必要です。 FreeBSD の man には、月末の金曜日を -v1d -v+1m -v-1d -v-fri で求める例が載っています。
macOS と Linux の両方で同じスクリプトを動かすなら、Homebrew の coreutils を入れて gdate を使うか、date +書式 だけで済む部分に留めると書き分けが減ります。
よくある質問
Q. 昨日の日付を YYYYMMDD 形式で取得するには?
A. GNU 版は date -d yesterday +%Y%m%d、macOS は date -v-1d +%Y%m%d です。 結果を変数に入れるなら y=$(date -d yesterday +%Y%m%d) と書きます。
Q. 月末の日付を求める一番確実な方法は?
A. 「その月の1日 +1 month -1 day」で求めます。 date -d "$(date +%Y-%m-01) +1 month -1 day" +%F は、うるう年の2月29日や30日の月でも正しい月末になります(実行結果は本文参照)。
Q. ミリ秒まで表示したいときは?
A. GNU 版は %3N でミリ秒(3桁)、%N でナノ秒(9桁)です。 date '+%F %T.%3N' で 2026-10-02 09:05:07.123 のように表示できます。エポックミリ秒は date +%s%3N です。
Q. date -d の解釈が意図と違うときはどう調べますか?
A. --debug を付けると、どの部分を日付・時刻・タイムゾーン・相対表現として読んだかが表示されます。 本文の 12:00 -3 hours の例のように、-3 がタイムゾーンとして読まれているといった原因がすぐにわかります。
まとめ
- 書式は
+%Y-%m-%dのように+に続けて指定し、%F(年-月-日)%T(時:分:秒)%s(エポック秒)%3N(ミリ秒)を覚えると大半をまかなえる - 日付計算は
-d '7 days ago'-d '2026-10-02 +3 days'。時刻の直後の-3 hoursはタイムゾーンとして読まれるのでagoを使う - 月末は「1日 +1 month -1 day」、前月末は「1日 -1 day」で求める
2026-01-31 +1 monthは2026-03-03になる。月を動かすときは日にちを15日などに置き換えてから計算するTZ=Asia/Tokyo dateで表示のタイムゾーンを切り替え、-d @秒数でエポック秒から日時に変換できる- ファイル名は
%Y%m%d_%H%M%S、API やログは-Isecondsや-u +%FT%TZが便利 - macOS(BSD 版)は
-vで計算、-j -fで読み込み。両対応ならgdateを使う
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「dateコマンドのフォーマット一覧と日付計算|月末・macOS差異もコピペで」
株式会社RJCでは、dateコマンドのような日々使うツールの知識を、仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。