2005-07-31

用Python转换一些Unix里的时间格式

UNIX世界的时间是从1970年开始算起的,一些程序为了省事,直接把这个记录秒数的数字放到了日志等文件中。在shell里,可以用date很容易的获得这个秒数;借助awk则可以把秒数再还原成字符串。

0$ date +%s
1122802026
0$ echo 1122802026 | awk '{print strftime("%Y-%m-%d %H:%M:%S", $1)}'
2005-07-31 17:27:06


不过我的一些程序是python编写的,为了转换这个数字,我使用下面的这个函数:
import time
def epoch2str(sec):
"""convert epoch time(UNIX) to string

for example:
>>> epoch2str(1122802026)
'2005-07-31 17:27:06'
"""
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(int(sec)))


还有一种日期格式,TAI64,提供了一种64比特、以纳秒为最小单位的时间格式。它是与操作系统、硬件架构无关的,格式类似于“@4000000042eb9fce1a7faf0c”,主要是在Qmail的日志中比较常见。有一个叫做daemontools的软件包,它包含 tail64ntai64nlocal 可以用来在shell中把这种时间转换成更易读的格式。不过这里的重点还是如何用python来读它。有一个pytai: TAI64 Python interface,提供完整的软件包,但我并不需要如此多的内容。看了看pytai的代码,发现读取方法其实很简单,完全可以简化成如下的一个函数:

from string import atol
from time import localtime,strftime

def tai64time(tai64string, timeformat="%Y-%m-%d %H:%M:%S"):
"""Convert TAI64 time format to human readable string.

TAI stands for Temps Atomique International, the current
international real-time standard. See alse:

http://cr.yp.to/libtai/tai64.html

for example:
>>> tai64time('@4000000042eb9fce1a7faf0c')
'2005-07-30 23:42:06.444575500'
"""
epoch = 4611686018427387904L
s = tai64string
if s[0] == "@": s = s[1:]
secs,usec = s[:16],s[16:24]
secs = atol(secs, 16)
nsec = atol(usec, 16)
return "%s.%d" % (strftime(timeformat, localtime(secs - epoch)), nsec)

没有评论: