dateコマンドを用いて日付計算(タイムスタンプ変換/加算/減算)を行います。GNU系とBSD系のdateコマンドパラメーター差異は分けて記述しています。(2019/03/16作成)
bus2896 / Pixabay
0)dateバージョン
GNU系 $ date --version | head -n 1 date (GNU coreutils) 8.22 BSD系 $ man date | tail -n 1 BSD May 7, 2015 BSD
1)日付フォーマットから unix time stamp にする
GNU系 $ date "+%s" --date "2019/03/16 11:18:00" 1552735080 BSD系 $ date -j -f "%Y/%m/%d %T" "2019/03/16 11:18:00" "+%s" 1552702680
2)unix time stamp を日付フォーマットにする
GNU系 $ date "+%Y/%m/%d %T" -d @1552735080 2019/03/16 11:18:00 BSD系 $ date -j -f "%s" "1552735080" "+%Y/%m/%d %T" 2019/03/16 20:18:00
3)指定日時の「11時間後」を求める
GNU系 $ date -d "2019/03/16 11:18:00 11 hour" "+%Y/%m/%d %T" 2019/03/16 22:18:00 BSD系 $ date -v+11H -j -f "%Y/%m/%d %T" "2019/03/16 11:18:00" "+%Y/%m/%d %T" 2019/03/16 22:18:00
4)指定日時の「11時間前」を求める
GNU系 $ date -d "2019/03/16 22:18:00 11 hour ago" "+%Y/%m/%d %T" 2019/03/16 22:18:00 BSD系 $ date -v-11H -j -f "%Y/%m/%d %T" "2019/03/16 22:18:00" "+%Y/%m/%d %T" 2019/03/16 11:18:00
5)解説
GNUの詳細
GNU系の場合は「 n days n hours ago 」といった指定により、任意の日数/時間数ずらした値を取得できます。
日時を指定しない場合は、現在日時を起点として計算します。
days以外にも hours, minutes, secondsを指定することで細かく指定できます。
agoを外すと加算になります。
BSDの詳細
BSD系の場合は、-vと数値の組み合わせで何日ずらすかを指定します。
-v[+|-][数字][ymwdHMS]
-v-1dであれば1日減算、-v+1dであれば1日加算します。
プラスもマイナスもない-v1dとした場合は、返却される日時のうち、日を「1」にします。
年の場合、年は「1980〜2038」か「80〜38」での指定になるので-v1yとしたときは「2001」となります。
例)
$ date "+%Y/%m/%d" 2019/03/16 $ date -v1d "+%Y/%m/%d" 2019/03/01 $ date -v1y "+%Y/%m/%d" 2001/03/16
数値の後に指定できる値は下記の通りです。
y 年 m 月 w 曜日 日曜が0 d 日 H 時 M 分 S 秒
以上