date(1)コマンドは現在時刻の出力やシステムの時刻の設定などに使われるが、フォーマットを変更して日付を出力したり、任意の日付文字列を別の任意の形式へ変換したり、1週間後や20日後といった指定で日付を出力するといった処理にも利用できる。
IEEE Std 1003.1 "POSIX.1"に記載されているdate(1)コマンドの規約はフォーマット指定と-uオプションのみで、ほかのオプションは規定されていない。このため、BSD date(1)とGNU Core Utilities date(1)ではオプションが大きく異なっている。ここではBSD date(1)で使われるオプションのうち特に便利なものを紹介する。
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はほかのオプションと組み合わせて用いられることが多い。
BSD date(1)コマンドは[[[[[cc]yy]mm]dd]HH]MM[.ss]のフォーマットで日付指定を受け付ける。-fオプションを使用すると任意のフォーマットで日付指定を受け付けることができるようになる。-fの第1引数でフォーマットを指定し、第2引数に対象となる文字列を指定する。第1引数で指定できるフォーマットに関してはdateコマンドのフォーマット一覧を参照のこと。
なお、BSD date(1)はさらに次のフォーマットが指定できるようになっている。
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のオプションはシェルスクリプトで日付処理をする場合などに活用されることが多い。
BSD date(1)では-vオプションを指定することで日付データをさまざまな値へ設定したり変更できる。数値を指定して値を設定できるほか、現在時刻を基軸にして時間を進めたり戻したりといった指定を行うことができる。
$ 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を参照のこと。