如何在Python中获得以毫秒为单位的当前时间?


使用time.time ():

import time

def current_milli_time():
    return round(time.time() * 1000)

然后:

>>> current_milli_time()
1378761833768

另一个解决方案是可以嵌入到您自己的utils.py中的函数

import time as time_ #make sure we don't override time
def millis():
    return int(round(time_.time() * 1000))

Time.time()可能只给出秒的分辨率,毫秒的首选方法是datetime。

from datetime import datetime
dt = datetime.now()
dt.microsecond

如果你想在你的代码中使用一个简单的方法,用datetime返回毫秒:

from datetime import datetime
from datetime import timedelta

start_time = datetime.now()

# returns the elapsed milliseconds since the start of the program
def millis():
   dt = datetime.now() - start_time
   ms = (dt.days * 24 * 60 * 60 + dt.seconds) * 1000 + dt.microseconds / 1000.0
   return ms

def TimestampMillisec64():
    return int((datetime.datetime.utcnow() - datetime.datetime(1970, 1, 1)).total_seconds() * 1000) 

我发现的以毫秒为单位获取当前UTC时间的最简单方法是:

# timeutil.py
import datetime


def get_epochtime_ms():
    return round(datetime.datetime.utcnow().timestamp() * 1000)

# sample.py
import timeutil


timeutil.get_epochtime_ms()

只是示例代码:

import time
timestamp = int(time.time()*1000.0)

输出: 1534343781311


对于Python 3.7+, time.time_ns()给出自epoch以来以纳秒为单位经过的时间。

这给出了以毫秒为单位的整数时间:

import time

ms = time.time_ns() // 1_000_000

这些以毫秒为单位的1000的乘法对于解决或使某些先决条件可以接受可能是不错的。它可以用来填补数据库中从未真正使用过它的空白。不过,在需要精确计时的真实情况下,它最终会失败。我不建议任何人将这种方法用于需要在特定时间进行操作或处理的关键任务操作。

例如: 往返ping在美国是30-80毫秒…你不能简单地把它加起来并有效地使用它。

我自己的例子要求每秒钟都有任务,这意味着如果我在第一个任务响应后进行四舍五入,我仍然会导致处理时间乘以每个主循环周期。结果是每60秒调用一次函数。一天大约1440英镑。不太准确。

只是一个想法,让人们寻找更准确的推理,而不是解决从未真正使用过的数据库差距。


如果你关心测量流逝的时间,你应该使用单调时钟(python 3)。例如,如果一个NTP查询调整了你的系统时间,这个时钟不会受到系统时钟更新的影响。

>>> import time
>>> millis = round(time.monotonic() * 1000)

它提供了一个以秒为单位的参考时间,可用于以后比较以测量经过的时间。


如果您使用我的代码(如下所示),时间将以秒为单位出现,然后在小数之后是毫秒。我认为Windows和Unix之间是有区别的——如果有,请评论。

from time import time

x = time()
print(x)

我的结果(在Windows上)是:

1576095264.2682993

编辑:没有区别:)谢谢tc0nn


只是Python 3+使用datetime模块的另一个解决方案。

时间到了,时间到了,时间到了。


unix诞生的时间

from time import time
while True:
    print(str(time()*1000)+'ms       \r', end='')

程序开始的时间

from time import time
init = time()
while True:
    print(str((time()-init)*1000)+'ms         \r', end='')

谢谢你的宝贵时间


在Python 3.8+中进行了一些测试后,我注意到这些选项给出了完全相同的结果,至少在Windows 10中是这样。

import time

# Option 1
unix_time_ms_1 = int(time.time_ns() / 1000000)
# Option 2
unix_time_ms_2 = int(time.time() * 1000)

请随意使用你更喜欢的一个,我不认为有任何需要比这个更复杂的解决方案。


在3.7之后的Python版本中,最好的答案是使用time.perf_counter_ns()。如文件所述:

Time.perf_counter() ->浮点数

返回性能计数器的值(以小数秒为单位),即具有最高可用分辨率的时钟,用于测量短时间。它确实包括睡眠期间所消耗的时间,并且是系统范围的。返回值的参考点未定义,因此只有连续调用结果之间的差值才是有效的。

Time.perf_counter_ns () -> int

类似于perf_counter(),但是返回以纳秒为单位的时间

正如它所说,这将使用您的系统所提供的最佳计数器,并且它是专门为测量性能而设计的(因此试图避免其他计时器的常见陷阱)。

它也给了你一个很好的纳秒整数,所以只要除以1000000就得到你的毫秒:

start = time.perf_counter_ns()
# do some work
duration = time.perf_counter_ns() - start
print(f"Your duration was {duration // 1000000}ms.")

更新:感谢@neuralmer。

最有效的方法之一:

(time.time_ns() + 500000) // 1000000  #rounding last digit (1ms digit)

or

time.time_ns() // 1000000          #flooring last digit (1ms digit)

在其他方法中,这两种方法都非常有效。

基准:

你可以在我自己的机器上看到一些不同方法的基准测试结果:

import time

t = time.perf_counter_ns()
for i in range(1000):
    o = time.time_ns() // 1000000           #each 200 ns
t2 = time.perf_counter_ns()
print((t2 - t)//1000)


t = time.perf_counter_ns()
for i in range(1000):
    o = (time.time_ns() + 500000) // 1000000  #each 227 ns
t2 = time.perf_counter_ns()
print((t2 - t)//1000)


t = time.perf_counter_ns()
for i in range(1000):
    o = round(time.time_ns() / 1000000)    #each 456 ns
t2 = time.perf_counter_ns()
print((t2 - t)//1000)


t = time.perf_counter_ns()
for i in range(1000):
    o = int(time.time_ns() / 1000000)      #each 467 ns
t2 = time.perf_counter_ns()
print((t2 - t)//1000)


t = time.perf_counter_ns()
for i in range(1000):
    o = int(time.time()* 1000)          #each 319 ns
t2 = time.perf_counter_ns()
print((t2 - t)//1000)

t = time.perf_counter_ns()
for i in range(1000):
    o = round(time.time()* 1000)       #each 342 ns
t2 = time.perf_counter_ns()
print((t2 - t)//1000)```