AIX系统用shell取前一天日期

写这篇博文原因是同事被新浪博客的一篇文章误导了。前年我也看过那篇文章,当时碰巧发现了问题,但只是自己在电脑上做了笔记,为了不让更多人被误导,在此写一文。

这篇误导大众的文章是:http://blog.sina.com.cn/s/blog_541a3cf10101expx.html
文章内取AIX系统前一天日期的命令 TZ=aaa24 date +%Y%m%d 是错误的!
小时数为 0~7 点时,得到的是大前天的日期。
我估计作者早上都在睡觉的吧,晚上的特例没错误就当标准了。

正确用法是:

AIX里取前一天的日期,16是由(24×1-8)获得
TZ=BEIST+16 date +%Y%m%d

AIX里取前两天的日期,40是由(24×2-8)获得
TZ=BEIST+40 date +%Y%m%d

AIX里取下一天的日期,32是由(24×1+8)获得,注意2个地方的正负号。
TZ=BEIST-32 date +%Y%m%d

前N天

1
2
X=24*N-8
TZ=BEIST+X

下N天

1
2
Y=24*N+8
TZ=BEIST-Y

使用前,确认环境的时区设置并做测试验证!不同环境可能导致结果和预想不同。

A 环境可能是这样的:

1
2
3
4
AAA> echo $TZ
Asia/Shanghai
AAA> date
Fri Nov 20 21:24:25 CST 2015

B 环境可能是这样的:

1
2
3
4
BBB> echo $TZ
BEIST-8
BBB> date
Thu Apr 2 18:34:00 BEIST 2015

需要根据环境的时区确定基础时区设置,可以写一个脚本放 crontab 定时任务里执行一天,比对结果决定使用哪种写法:

1
30 * * * * /HOME/user/yesterday.sh >> /HOME/user/yesterday.log
1
2
3
4
5
6
7
8
#!/bin/sh
date "+%Y%m%d %T"
echo "aaa16"
TZ=aaa16 date +%Y%m%d
echo "BEIST+16"
TZ=BEIST+16 date +%Y%m%d
echo "CST+16"
TZ=CST+16 date +%Y%m%d