如何创建毫秒级精度的Python时间戳?

44

我需要一个自纪元以来的单个毫秒(ms)时间戳。这应该不难,我相信我只是错过了一些datetime或类似的方法。

实际上,微秒(µs)粒度也可以。我只需要小于1/10秒的定时。

例如,我有一个事件每750毫秒发生一次,假设它检查灯是开还是关。 我需要记录每个检查和结果并稍后进行审核,所以我的日志应如下所示:

...00250 Light is on
...01000 Light is off
...01750 Light is on
...02500 Light is on
如果我只有完整的秒粒度,我的日志将会像这样:
...00 Light is on
...01 Light is off
...01 Light is on
...02 Light is on

不够精确。


4
澄清一下——微秒是秒的百万分之一,毫秒是秒的千分之一。 - Brendan
微秒或毫秒都可以。我只需要少于1/10秒(一厘秒)。 - Skip Huffman
5
0.1秒是十分之一秒,百分之一秒则为0.01秒。 - tripleee
3个回答

65
import time
time.time() * 1000

其中1000是每秒的毫秒数。如果你只是想得到自纪元以来的百分之一秒,则将其乘以100。


3
使用int((time.time() + 0.5) * 1000)可以得到距离当前时间最近的毫秒数。 - bgporter
11
@bgporter: 或者 int(round(time.time() * 1000))。意思是:将当前时间乘以1000并四舍五入后取整,得到一个以毫秒为单位的时间戳。 - nmichaels
好的,time.time() 给了我带有1/100精度的十进制秒。这就可以了。 - Skip Huffman
除了我需要将它从指数符号中取出之外,其他都可以。 - Skip Huffman
3
"@Skip: int(round(time.time() * 1000)) 给出了 1300819189007。你是否对它进行了一些奇怪的操作?" - nmichaels
啊,这正是我需要的 round 函数。谢谢。 - Skip Huffman

13
在Python中,datetime.now() 返回的值可能比 time.time() 具有更高的精度:
from datetime import datetime, timezone, timedelta

now = datetime.now(timezone.utc)
epoch = datetime(1970, 1, 1, tzinfo=timezone.utc) # use POSIX epoch
posix_timestamp_millis = (now - epoch) // timedelta(milliseconds=1) # or `/ 1e3` for float

理论上,time.gmtime(0)(由time.time()使用的时代)可能与1970不同。


为了让你的代码正常工作,我需要在调用中添加datetime.datetime。 - Tom Chapin
3
@TomChapin 错了,答案中的代码本身是可行的。看一下代码中第一行的导入语句。 - jfs

3
请注意,尽管您可以将time.time()与所需的精度相乘,但这并不保证您的设备实际上具有该精度。例如,在Windows上只有+-1毫秒的精度(source)。为了提高准确性,请使用:
import time

now_ns = time.time_ns() # Time in nanoseconds
now_ms = int(now_ns / 1000000)

仅适用于 Python 3.7 及以上版本。

1
不错的提示,只需要将 * 更改为 /。 - Daniel Hjertholm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接