コマンドTips

dateコマンドの便利な使い方 : GNU Core Utilities date

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

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

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

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

-d "数字 years"
年を指定した年数進める
-d "数字 months"
月を指定した月数進める
-d "数字 weeks"
週を指定した数進める(1週間ごと進める)
-d "数字 days"
日を指定した日数進める
-d "数字 hours"
時を指定した時間進める
-d "数字 minutes"
分を指定した分数進める
-d "数字 seconds"
秒を指定した秒数進める
-d "数字 years ago"
年を指定した年数戻す
-d "数字 months ago"
月を指定した月数戻す
-d "数字 weeks ago"
週を指定した数戻す(1週間ごと戻す)
-d "数字 days ago"
日を指定した日数戻す
-d "数字 hours ago"
時を指定した時間戻す
-d "数字 minutes ago"
分を指定した分数戻す
-d "数字 seconds ago"
秒を指定した秒数戻す

なお、GNU date(1)では数字の前に@を指定すると、その数字はUNIX時間(1970年1月1日0時0分0秒からの経過秒数)として扱われるようになる。BSD dateではフォーマット%sがUNIX時間の指定に使われる。

$ date
2012年  4月 23日 月曜日 21:25:30 JST
$ 
$ date -d "5 years ago"
2007年  4月 23日 月曜日 21:27:36 JST
$ 
$ date -d "1 year ago 6 months ago 45 minutes"
2010年 10月 23日 土曜日 22:18:27 JST
$ 

-dオプションを使用すると、例えば本日から向こう20日間の日付けリストを作成するといった処理を実施できる。

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

日付フォーマットの変更や、特定の日付データの生成はさまざまな場面で重要になる機能のひとつ。

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

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