如何将纳秒的纪元时间转换为人类可读的?

Posted

技术标签:

【中文标题】如何将纳秒的纪元时间转换为人类可读的?【英文标题】:How to convert epoch time with nanoseconds to human-readable? 【发布时间】:2013-03-17 00:11:52 【问题描述】:

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

Python 日期时间对象和转换方法仅支持毫秒精度。

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

【问题讨论】:

@abarnert 我不这么认为。这个问题涉及将数字转换为人类可读的字符串,而该问题正在尝试从字符串转换为 datetime 对象。 @ethg242:这个问题到处都是,但归结为同一件事:datetime 不处理纳秒,所以你必须自己做数学/字符串。也许有一个关于strptime 的问题和另一个关于strftime 的问题。 这比复制的要好 @abarnert 你真的看过另一个问题的答案吗?哈哈。出于某种原因,naxa 是对的,这个答案更好,不知道为什么。 @victorhooi:是的,有时复制确实比原来的要好。这意味着你不应该仅仅因为它可能是一个重复的问题而忽略它(注意这里的两个答案之一是我的),但这并不意味着我们不应该标记重复。 【参考方案1】:

首先,将其转换为具有第二精度的datetime 对象(取整,非取整):

>>> from datetime import datetime
>>> dt = datetime.fromtimestamp(1360287003083988472 // 1000000000)
>>> dt
datetime.datetime(2013, 2, 7, 17, 30, 3)

然后为了使其易于阅读,请在您返回的对象上使用strftime() 方法:

>>> 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'

【讨论】:

我的问题是,使用1360287003083988472 // 1000000000,您可能会丢失有价值的信息。可以通过使用datetime.fromtimestamp(1360287003083988472 / 1000000000) 来获得一种人类可读的格式。【参考方案2】:

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

>>> nanos = 1360287003083988472
>>> secs = nanos / 1e9
>>> dt = datetime.datetime.fromtimestamp(secs)
>>> dt.strftime('%Y-%m-%dT%H:%M:%S.%f')
'2013-02-07T17:30:03.083988'

但如果您确实需要 纳秒,那仍然无济于事。最好的办法是编写自己的包装器:

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)

【讨论】:

以上是关于如何将纳秒的纪元时间转换为人类可读的?的主要内容,如果未能解决你的问题,请参考以下文章

将纪元转换为人类可读的日期在 python 中不起作用

在 Mac OSX 上将 unix 纪元时间转换为人类可读的日期 - BSD

在mysql中将纪元数转换为人类可读的日期

bash将csv尾部的纪元时间转换为人类可读

如何在 Teradata 中将纪元时间转换为人类可读

将人类可读的日期转换为纪元时间戳