如何在Python中获取POSIX/Unix时间(秒和纳秒)?

70 投票
6 回答
135995 浏览
提问于 2025-04-15 20:06

我一直在寻找一种方法,想要在Python中获取自1970年1月1日00:00:00 UTC以来的时间,单位是秒和纳秒,但我找不到能给我正确精度的方法。

我尝试使用时间模块,但它的精度只有微秒,所以我试过的代码是:

import time

print time.time()

这段代码给我的结果是这样的:

1267918039.01

然而,我需要的结果应该是这样的:

1267918039.331291406

有没有人知道如何以秒和纳秒的形式表示UNIX时间?我找不到设置正确精度或得到正确格式结果的方法。谢谢大家的帮助。

6 个回答

10

能否获得纳秒级的精确度,主要取决于你的时钟类型、操作系统和硬件。根据time模块的说明

各种实时函数的精确度可能没有它们的值或参数所表示的单位那么高。例如,在大多数Unix系统上,时钟每秒只“滴答”50或100次。

在Python 3中,time模块提供了5种不同类型的时钟,每种时钟都有不同的特性;其中一些可能提供纳秒级的计时精度。你可以使用time.get_clock_info()函数来查看每种时钟提供的功能以及报告的时间精度。

在我的OS X 10.11笔记本上,提供的功能有:

>>> for name in ('clock', 'monotonic', 'perf_counter', 'process_time', 'time'):
...     print(name, time.get_clock_info(name), sep=': ')
...
clock: namespace(adjustable=False, implementation='clock()', monotonic=True, resolution=1e-06)
monotonic: namespace(adjustable=False, implementation='mach_absolute_time()', monotonic=True, resolution=1e-09)
perf_counter: namespace(adjustable=False, implementation='mach_absolute_time()', monotonic=True, resolution=1e-09)
process_time: namespace(adjustable=False, implementation='getrusage(RUSAGE_SELF)', monotonic=True, resolution=1e-06)
time: namespace(adjustable=True, implementation='gettimeofday()', monotonic=False, resolution=1e-06)

所以,使用time.monotonic()time.perf_counter()函数理论上可以让我获得纳秒级的分辨率。不过,这两种时钟都不提供实际时间,只记录经过的时间;它们的值在其他方面是任意的。不过,它们在测量某个操作花费了多长时间时非常有用。

47

你的精度丢失是因为字符串格式化的问题:

>>> import time
>>> print "%.20f" % time.time()
1267919090.35663390159606933594
60

自从 Python 3.7 版本开始,使用 time.time_ns() 获取时间变得很简单。

这个方法和 time() 类似,但它返回的是从1970年1月1日开始的时间,以纳秒为单位的整数。

在 Python 3.7 版本中,所有新增的功能都包括纳秒的支持:PEP 564: 添加具有纳秒精度的新时间函数

撰写回答