AIX の date コマンドで昨日の日付を取得する

date コマンドで昨日の日付を取得したい場合どうしようかと問うと、 -d 'yesterday' 付ければいいよなんて言われますが、それ GNU の date だよね…

AIX の場合ですが、こういう昔ながらの UNIX ではそんな便利なオプション無いんですよ。

バカ正直に日付の引き算コードを書くのもつらいし。

というわけでタイムゾーンをずらして日付を取り出すという技を使います。

存在しないタイムゾーンを渡すと UTC で処理されますので、そこに差分時間を添えればよいです。

ネットの掲示板などを見てると TZ=AAA24 という事例が多くあります。

AAA24 をあたえると UTC から 24 時間引いた時刻となります。

これは AAA+24 と同等です。逆に未来時間なら AAA-24 とすればいいわけです。

で、日本でそのままコレを使うとあんまりうれしくないことが起こります。日本は既に UTC から 9時間の時差があるわけです。

システムが日本時間で動いている場合はこの 9時間の差を考慮してやります。

例です:

日本時間で 2013/11/27 12:00 のとき

 

$ date '+%Y/%m/%d %H:%M'
2013/11/27 12:00

$ TZ=AAA date '+%Y/%m/%d %H:%M'
2013/11/27 03:00

$ TZ=AAA24 date '+%Y/%m/%d %H:%M'
2013/11/26 03:00

$ TZ=AAA15 date '+%Y/%m/%d %H:%M'
2013/11/26 12:00

 

日本時間だと TZ=AAA15 で良さそうですね。

この 9時間分を放置しておくと(他の国だとまた違うタイムゾーンなので別のズレが生じる)日付が変わってから0時~9時のときおかしなことになります。

日本時間 2013/11/27 23:00 のとき、

TZ=AAA15 だと 2013/11/26 23:00 きちんと1日前。

TZ=AAA24 だと 2013/11/26 14:00 時間はアレだけど日付は1日前。

日本時間 2013/11/28 00:00 のとき、

TZ=AAA15 だと 2013/11/27 00:00 きちんと1日前。

TZ=AAA24 だと2013/11/26 15:00 日付が2日前になってしまってる。

というわけで昨日の日付を持って処理を回したいときなんかはシェルスクリプトの中とかで

 

YESTERDAY=`TZ=AAA15 date '+%Y%m%d'`
echo $YESTERDAY

 

などとやってやれば良いです。