1. 苏葳的备忘录首页
  2. 操作系统

AIX的shell脚本中求前几天的日期

aix shell dateShell脚本虽然功能已经足够强大,但毕竟不是一种全能的编程语言。表现在实现一些功能时,必须与操作系统的内外部命令紧密结合才能完成。Shell脚本中想要取得前几天的日期的话,由于存在28、29、30、31天每月的情况,所以不能直接运算。在linux下,date有-d参数,如date -d yesterday 能显示前一天日期。但在AIX 5.3下,date并没有-d参数。网上有些高手写了复杂的脚本,然而还有更简单的方法:

YE=`TZ=aaa24 date +%Y%m%d`

可以看出,其实是用临时改变系统时区的方法,来让date“误”算出前一天的日期。那么这个aaa是什么意思呢?回头再查,若把aaa24改为aaa48,则是前两天的日期。既然aaa不懂,那么写成TZ=TZ+24就更好理解,当前时区+24小时。这样系统时钟就“落后”于临时设置的时区24小时,算出来的,也是前一天的日期。

今天试了一下,发现上述写法有诸多错误,结果也不是预计的结果!首先看下环境变量TZ的设置:

一个小脚本:

echo $TZ
TZ=TZ+4
echo $TZ
TZ=$TZ+4
echo $TZ

运行,输出如下:

$ sh tt.sh
BEIST-8BEIDT
TZ+4
TZ+4+4

显然:系统默认时区是BEIST-8BEIDT 这是中国时间的夏令时形式(后面以DT结尾Daylight time),那么时间应该是比标准时GMT早8+1=9小时。而无论是TZ+4或者是$TZ+4,证明作为一个字符串型环境变量TZ,根本不支持这种+4的操作。因而实际上,是把变量TZ设成了TZ+4或TZ+4+4这个时区名,有TZ时区存在吗?显然不存在。。但后面的+4却是起作用的,在后面再分析。

下面澄清一下时区的概念。北京时间位于东八区,因而时间比伦敦标准时要早8个小时,即当中国是早上11点时,伦敦是早上11-8=3点钟。若中国采用夏令时计时,则当北京时间夏令时是早上11点时,伦敦是早上11-8-1=2点。

厘清概念后,再看一个脚本的运行结果:

echo TZ:$TZ
date

结果:

TZ:BEIST-8BEIDT
Wed Apr 16 11:27:03 BEIDT 2014

没什么好说的,显示系统当前时区和时间

echo ----------------------
TZ=GMT
echo TZ:$TZ
date

结果:

TZ:GMT
Wed Apr 16 02:27:03 GMT 2014

将时区设为GMT,伦敦标准时,是否伦敦标准时在系统中是以GMT来表示的呢?其实不重要,因为假设TZ设为一个不存在的时区时,默认自动采用伦敦标准时,可以看到,此时间正好比中国夏令时少了11-8-1=2个小时。

echo ----------------------
TZ=agadfdfd
echo TZ:$TZ
date

结果:

TZ:agadfdfd
Wed Apr 16 02:27:03 agadfdfd 2014

为了证实胡乱设置的TZ值是否默认采用标准时,将TZ值设为随机字符,证明确实如此。这也能解释前面的aaa24中的aaa的含义,其实也是一个不存在的时区,迫使系统采用标准时而已。设成agdfdf与设成GMT的结果是一致的。

echo ----------------------
TZ=agdfdf7
echo TZ:$TZ
date

结果:

TZ:agdfdf7
Tue Apr 15 19:27:03 agdfdf 2014

注意此处,当TZ值的后缀为数字时,此数字默认为标准时-该数字,此时的TZ设置就等同于标准时-7小时,即比标准时又晚了7小时,Wed Apr 16 02:27:03 晚7小时=20140415 19:27:03 (同一时刻。。此时区的时钟时间比标准时区的时钟时间小7个小时)

echo ----------------------
TZ=gdfjk8
echo TZ:$TZ
date

结果:

TZ:gdfjk8
Tue Apr 15 18:27:03 gdfjk 2014

同上,晚8小时,变为标准时前一天的18点。

echo ----------------------
TZ=gdfjk-8
echo TZ:$TZ
date

结果:

TZ:gdfjk-8
Wed Apr 16 10:27:03 gdfjk 2014

后缀为-8呢?反过来算,是比标准时早(领先)8小时,得到20140416 的10:27:03 这实际上是中国标准时间了。

echo ----------------------
TZ=gdfjk-9
echo TZ:$TZ
date

结果:

TZ:gdfjk-9
Wed Apr 16 11:27:03 gdfjk 2014

后缀为-9,时间正好于当前默认时区的系统时间相同,即相当于中国标准时+夏令时的时间。

echo ----------------------
TZ=agdfd15
echo TZ:$TZ
date

结果:

TZ:agdfd15
Tue Apr 15 11:27:03 agdfd 2014

后缀为15,比标准时间晚(落后)15小时,由于伦敦标准理比中国标准夏令时又落后9小时,则此时区设置就正好比中国标准夏令时晚(落后)15+9=24小时,即一天时间。由此可见,若要求出比中国标准时的夏令时时间晚24小时的时间,只需将TZ设为gdfgdf15即可。因此aix下,当前时间为中国夏令时的条件下,求前一天日期的方法是:

YE=`TZ=sdfdgf15 date +%Y%m%d`

当然,如此换算确实麻烦,回头学习一下时区的设置方面内容,应该有更方便的方法。

原创文章,作者:苏葳,如需转载,请注明出处:https://www.swmemo.com/546.html

发表评论

邮箱地址不会被公开。 必填项已用*标注