UNIX:dateコマンドで日付計算(タイムスタンプ/加算/減算)する

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	秒

以上

About yoshimasa

埼玉県さいたま市在住、2男3女のパパです。Linux系の技術情報を中心にまとめています。1978年2月生まれ。