コマンドTips

dateコマンドの便利な使い方 : BSD date

date(1)コマンドは現在時刻の出力やシステムの時刻の設定などに使われるが、フォーマットを変更して日付を出力したり、任意の日付文字列を別の任意の形式へ変換したり、1週間後や20日後といった指定で日付を出力するといった処理にも利用できる。

IEEE Std 1003.1 "POSIX.1"に記載されているdate(1)コマンドの規約はフォーマット指定と-uオプションのみで、ほかのオプションは規定されていない。このため、BSD date(1)とGNU Core Utilities date(1)ではオプションが大きく異なっている。ここではBSD date(1)で使われるオプションのうち特に便利なものを紹介する。

時刻を設定せずに出力だけ実行するオプション-j

date(1)コマンドに特定のフォーマット[[[[[cc]yy]mm]dd]HH]MM[.ss]の日付を引数に与えると、その値に従って日付を設定しようとする。-jを指定すると、システムの日付は変更せずに、指定された日付のみを出力するようになる。

$ date -j 202001011215.00
2020年 1月 1日 水曜日 12時15分00秒 JST
$ date
2012年 4月23日 月曜日 17時24分23秒 JST
$ 

特定の日付が出力されればよく、システムの日付を変更したくない場合にはこのオプションを使用する。-jはほかのオプションと組み合わせて用いられることが多い。

任意のフォーマットで日付指定を受け付けることができるようにするオプション-f

BSD date(1)コマンドは[[[[[cc]yy]mm]dd]HH]MM[.ss]のフォーマットで日付指定を受け付ける。-fオプションを使用すると任意のフォーマットで日付指定を受け付けることができるようになる。-fの第1引数でフォーマットを指定し、第2引数に対象となる文字列を指定する。第1引数で指定できるフォーマットに関してはdateコマンドのフォーマット一覧を参照のこと。

なお、BSD date(1)はさらに次のフォーマットが指定できるようになっている。

%s
UNIX時間(1970年1月1日0時0分0秒からの経過秒数)

GNU Core Utilities dateでは数字の前に@を指定するとUNIX時間になる。

-fによる日付受付の設定は-jと組み合わせることでさまざまな利用ができる。任意の形式で日付指定を受け取り日付を出力できる。

$ i="2020/01/01 12:15.00 (JST)"
$ date -j -f "%Y/%m/%d %H:%M.%S (JST)" "${i}"
2020年 1月 1日 水曜日 12時15分00秒 JST
$ 

-jや-fのオプションはシェルスクリプトで日付処理をする場合などに活用されることが多い。

時刻をさまざまな方法で調整するオプション-v

BSD date(1)では-vオプションを指定することで日付データをさまざまな値へ設定したり変更できる。数値を指定して値を設定できるほか、現在時刻を基軸にして時間を進めたり戻したりといった指定を行うことができる。

-v数字y
年を指定(1980〜2038ないしは80〜38)
-v数字m
月を指定(1〜12ないしはJan〜Dec)
-v数字w
曜日を指定(0〜6ないしはSun〜Sat)
-v数字d
日を指定(1〜31)
-v数字H
時を指定(0〜23)
-v数字M
分を指定(0〜59)
-v数字S
秒を指定(0〜59)
-v+数字y
年を指定した年数進める
-v+数字m
月を指定した月数進める
-v+数字w
週を指定した数進める(1週間ごと進める)
-v+数字d
日を指定した日数進める
-v+数字H
時を指定した時間進める
-v+数字M
分を指定した分数進める
-v+数字S
秒を指定した秒数進める
-v-数字y
年を指定した年数戻す
-v-数字m
月を指定した月数戻す
-v-数字w
週を指定した数戻す(1週間ごと戻す)
-v-数字d
日を指定した日数戻す
-v-数字H
時を指定した時間戻す
-v-数字M
分を指定した分数戻す
-v-数字S
秒を指定した秒数戻す
$ date
2012年 4月23日 月曜日 21時30分55秒 JST
$ 
$ date -v2020y
2020年 4月23日 木曜日 21時31分01秒 JST
$ 
$ date -v+5y
2017年 4月23日 日曜日 21時31分07秒 JST
$ 
$ date -v-1y -v-6m -v+45M
2010年 10月23日 土曜日 22時16分29秒 JST
$ 

-j、-f、-vを組み合わせることで、例えば本日から向こう20日間の日付けリストを作成するといった処理を実施できる。

$ i=$(date "+%Y%m%d")
$ for j in $(seq 20) 
> do
> 	echo $i
> 	i=$(date -v+1d -j -f "%Y%m%d" "${i}" "+%Y%m%d")
> done
20120423
20120424
20120425
20120426
20120427
20120428
20120429
20120430
20120501
20120502
20120503
20120504
20120505
20120506
20120507
20120508
20120509
20120510
20120511
20120512
$ 

日付フォーマットの変更や、特定の日付データの生成はさまざまな場面で重要になる機能のひとつ。BSD date(1)コマンドはこうした要望に細かく応えられる機能を提供している。

date(1)コマンドで使用できるIEEE Std 1003.1 "POSIX.1"規定のフォーマットに関してはdateコマンドのフォーマット一覧 : IEEE Std 1003.1 "POSIX.1"を参照のこと。GNU date(1)におけるオプションに関してはdateコマンドの便利な使い方 : GNU Shell Utilities dateを参照のこと。

last modified: 2014-03-17 20:03:17