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的软件包,它包含 tail64n和tai64nlocal 可以用来在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)
没有评论:
发表评论