【问题标题】: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:是的,有时复制确实比原来的要好。这意味着你不应该仅仅因为它可能是一个重复的问题而忽略它(注意这里的两个答案之一是我的),但这并不意味着我们不应该标记重复。

标签: python time epoch nanotime


【解决方案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)

【讨论】:

    猜你喜欢
    • 2019-11-06
    • 2018-12-13
    • 2012-08-16
    • 2014-12-04
    • 2013-01-13
    • 1970-01-01
    • 2015-10-12
    • 2012-11-12
    相关资源
    最近更新 更多