在Python中以秒和纳秒获取POSIX / Unix时间?

Get POSIX/Unix time in seconds and nanoseconds in Python?

我一直在努力找到一种方法来获取自1970-01-01 00:00:00 UTC以来的时间,以秒为单位,在python中以纳秒为单位,我找不到能给我正确精度的任何东西。

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

1
2
3
import time

print time.time()

这给了我这样的结果:

1
1267918039.01

但是,我需要一个看起来像这样的结果:

1
1267918039.331291406

有谁知道以秒和纳秒表达UNIX时间的可能方法? 我找不到设置正确精度或以正确格式获得结果的方法。 感谢您的任何帮助


由于字符串格式化,您的精度正在丢失:

1
2
3
>>> import time
>>> print"%.20f" % time.time()
1267919090.35663390159606933594


从Python 3.7开始,使用time.time_ns()很容易实现

Similar to time() but returns time as an integer number of nanoseconds since the epoch.

在Python 3.7版本中包含纳秒的所有新功能:
PEP 564:添加纳秒级分辨率的新时间函数


问题可能与您的操作系统有关,而不是Python。请参阅time模块的文档:http://docs.python.org/library/time.html

time.time()

Return the time as a floating point
number expressed in seconds since the
epoch, in UTC. Note that even though
the time is always returned as a
floating point number, not all
systems provide time with a better
precision than 1 second. While this
function normally returns
non-decreasing values, it can return a
lower value than a previous call if
the system clock has been set back
between the two calls.

换句话说:如果你的操作系统无法做到,那么Python就无法做到。您可以将返回值乘以适当的数量级,以获得纳秒值,尽管可能不精确。

编辑:返回是一个浮点变量,因此逗号后面的位数会有所不同,无论您的操作系统是否具有该精度级别。您可以使用"%.nf"对其进行格式化,其中n是您想要的位数,但是,如果您想要一个固定点字符串表示。


这取决于时钟的类型,你的操作系统和硬件是否有甚至可以达到纳秒精度。从time模块文档:

The precision of the various real-time functions may be less than suggested by the units in which their value or argument is expressed. E.g. on most Unix systems, the clock"ticks" only 50 or 100 times a second.

在Python 3上,time模块允许您访问5种不同类型的时钟,每种时钟具有不同的属性;其中一些可能为您提供纳秒精确计时。使用time.get_clock_info()功能查看每个时钟提供的功能以及报告的精确时间。

在我的OS X 10.11笔记本电脑上,可用的功能包括:

1
2
3
4
5
6
7
8
>>> 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()函数理论上会给我纳秒分辨率。两个时钟都没有给我一个时间,只有经过的时间;这些值是其他任意的。然而,它们可用于测量物品的使用时间。


您不太可能从任何当前的机器获得纳秒精度。

机器无法创建精度,并且在不合适的位置显示有效数字不是正确的事情。


我不认为有一种独立于平台的方式(可能是某些第三方编写了一个,但我找不到它)以在纳秒内获得时间;您需要以特定于平台的方式执行此操作。例如,这个SO问题的答案显示了如何在为"实时"操作提供librt.so系统库的平台上执行此操作。