Linux/Solair对时间的处理

今天跟老铁在Solaris上调试一个小的脚本,最初的需求是希望用Shell来实现修改系统时间,随机提前N秒或者推迟N秒。这个在Linux中是非常容易做到的,因为Linux的date函数提供了一个–date选项,可以支持秒,分钟,小时,甚至天或者月的修改,用法如下。

1) 取之前的时间:
date -d “a day ago” 取出前1天的系统时间
date -d “2 days ago” 取出前2天的系统时间

2) 取之后的时间:
date -d “a day ” 取出1天后的系统时间
date -d “2 days” 取出2天后的系统时间

因为Linux下的date是基于GNU的,但是Solaris基于POSIX的时间函数并没有提供类似的功能,甚至连秒一下的单位都无法直接获得,而是要自己写函数获得微秒和毫秒。

那么如何利用Shell在Solaris中实现之前的需求呢。有这么几种方法来实现:

利用其它语言,比如Perl、Tcl或者python。还有就是利用时区,但是这个仅仅局限于小时的修改,精确到分钟或者秒就不行了:

1)取之前的时间:yesterday=`TZ=$TZ+3; date +%Y%m%d`; echo $yesterday 取出前1天的系统时间

yesterday=`TZ=$TZ+27; date +%Y%m%d`; echo $yesterday 取出前2天的系统时间

2)取之后的时间:yesterday=`TZ=$TZ-22; date +%Y%m%d`; echo $yesterday 取出后1天的系统时间

yesterday=`TZ=$TZ-46; date +%Y%m%d`; echo $yesterday 取出后1天的系统时间

这里需要几点:
1)不能在命令行中直接执行TZ=$TZ-100; date +%Y%m%d,这样会修改当前terminal中的TZ和系统时间。
2)TZ=$TZ+3 需要加减多少小时才是前/后一天,和系统的$TZ有关。以上运算是在$TZ=PRC下进行的。

在Perl中,可以取epoch时间,并加上一定的秒数然后再转回来:
#perl -e ‘print int(time)’

相对于Solaris,在Linux中,取epoch时间就容易的多,只需要一条Shell命令。

关于GNU,POSIX和epoch,可以参考维基百科

The Book of Eli hd

This entry was posted in 脚本语言 and tagged . Bookmark the permalink.

One Response to Linux/Solair对时间的处理

  1. 基金123 says:

    改时间应该是比较基础的吧。。。 虽然这个我还不懂.

Leave a Reply to 基金123 Cancel reply

Your email address will not be published. Required fields are marked *