date -d

シェルスクリプトで「1日前」や「1ヶ月後」のような相対的な日付を計算したい場合がある。

dateコマンドに-dオプションで日付文字列を指定すると、相対的な日付を計算できる。

$ date
2026年  7月 12日 日曜日 17:42:19 JST

$ date -d '1 day ago'
2026年  7月 11日 土曜日 17:42:19 JST

$ date -d 'tomorrow'
2026年  7月 13日 月曜日 17:42:19 JST

$ date -d '3 days'
2026年  7月 15日 水曜日 17:42:19 JST

$ date -d '1 week ago'
2026年  7月  5日 日曜日 17:42:19 JST

$ date -d '1 month ago'
2026年  6月 12日 金曜日 17:42:19 JST

$ date -d '1 year ago'
2025年  7月 12日 土曜日 17:42:19 JST

起点となる日付を指定する

日付文字列の先頭に基準日を指定すると、現在時刻ではなくその日付を起点に計算できる。

$ date -d '2025-05-28 + 10 days' +'%Y-%m-%d'
2025-06-07

$ date -d '2025-05-28 - 1 month' +'%Y-%m-%d'
2025-04-28

$ date -d '2025-05-28 3 days ago' +'%Y-%m-%d'
2025-05-25

曜日を指定する

nextlastと曜日を組み合わせると、直近の該当曜日を計算できる。

$ date -d 'next monday' +'%Y-%m-%d'
2026-07-13

$ date -d 'last friday' +'%Y-%m-%d'
2026-07-10

シェルスクリプトでの活用例

コマンド置換と組み合わせると、変数の日付を起点に計算できる。

$ target_date=$(date '+%Y-%m-%d')
$ date -d "$target_date + 7 days" +'%Y-%m-%d'
2026-07-19

ログファイルの世代管理やバッチ処理の対象期間の算出など、日付を起点にした計算が必要な場面で活用できる。

macOSでの注意点

-dオプションはGNU coreutils版のdateコマンドに固有のオプションである。macOS標準のdateコマンド(BSD date)には存在せず、そのままでは動作しない。

macOSで同様に相対的な日付を計算するには、Homebrewでcoreutilsをインストールしgdateコマンドを使用する。

$ brew install coreutils
$ gdate -d 'tomorrow'