Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将具有纳秒的历元时间转换为人类可读的时间?_Python_Time_Epoch_Nanotime - Fatal编程技术网

Python 如何将具有纳秒的历元时间转换为人类可读的时间?

Python 如何将具有纳秒的历元时间转换为人类可读的时间?,python,time,epoch,nanotime,Python,Time,Epoch,Nanotime,我有一个以纳秒为单位的大纪元时间戳,例如自1970-01-01以来的1360287003083988472纳秒 Python datetime对象和转换方法仅支持毫秒精度 有没有一种简单的方法可以将这个历元时间转换为人类可读的时间?首先,将其转换为具有第二精度的对象(地面,而不是四舍五入): 然后,要使其易于阅读,请对返回的对象使用以下方法: >>> s = dt.strftime('%Y-%m-%d %H:%M:%S') >>> s '2013-02-07

我有一个以纳秒为单位的大纪元时间戳,例如自1970-01-01以来的
1360287003083988472
纳秒

Python datetime对象和转换方法仅支持毫秒精度

有没有一种简单的方法可以将这个历元时间转换为人类可读的时间?

首先,将其转换为具有第二精度的对象(地面,而不是四舍五入):

然后,要使其易于阅读,请对返回的对象使用以下方法:

>>> s = dt.strftime('%Y-%m-%d %H:%M:%S')
>>> s
'2013-02-07 17:30:03'
最后,再加上纳秒精度:

>>> s += '.' + str(int(1360287003083988472 % 1000000000)).zfill(9)
>>> s
'2013-02-07 17:30:03.083988472'

实际上,Python的
datetime
方法处理的是微秒精度,而不是毫秒:

但如果你真的需要纳秒,那还是没用。您最好编写自己的包装器:

def format_my_nanos(nanos):
    dt = datetime.datetime.fromtimestamp(nanos / 1e9)
    return '{}{:03.0f}'.format(dt.strftime('%Y-%m-%dT%H:%M:%S.%f'), nanos % 1e3)
这给了我:

'2013-02-07T17:30:03.083988472'
当然,你也可以做同样的事情,即使Python根本没有达到亚秒精度

def format_my_nanos(nanos):
    dt = datetime.datetime.fromtimestamp(nanos / 1e9)
    return '{}.{:09.0f}'.format(dt.strftime('%Y-%m-%dT%H:%M:%S'), nanos % 1e9)

@恐怕我不这么认为。这个问题涉及将数字转换为人类可读的字符串,而这个问题正试图从字符串转换为
datetime
对象。@ethg242:这个问题有点像是到处都是,但归结起来是同一件事:
datetime
不能处理纳秒,所以你必须自己做数学/stringops。也许有一个关于strtime的问题和另一个关于strftime的问题是可以的。这个问题比duplicate@abarnert你看过另一个问题的答案了吗?哈哈。不知什么原因,纳西是对的,这个问题的答案结果更好,不知道为什么。@victorhooi:是的,有时候DUP确实比原来的好。这意味着您不应该仅仅因为某个问题可能是dup而忽略它(请注意,这里的两个答案中有一个是我的),但这并不意味着我们不应该标记dup。我的问题是,使用
1360287003083988472//100000000
,您可能会丢失有价值的信息。通过使用
datetime.fromtimestamp(1360287003083988472/100000000)
可以获得人类可读的格式。
'2013-02-07T17:30:03.083988472'
def format_my_nanos(nanos):
    dt = datetime.datetime.fromtimestamp(nanos / 1e9)
    return '{}.{:09.0f}'.format(dt.strftime('%Y-%m-%dT%H:%M:%S'), nanos % 1e9)