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