获取Python中的当前时间(以毫秒为单位)?

Naf*_*Kay 468 python time datetime

如何在Python中获取当前时间(以毫秒为单位)?

Naf*_*Kay 644

根据我上面的@samplebias评论,我需要的是以下内容:

import time
millis = int(round(time.time() * 1000))
print millis
Run Code Online (Sandbox Code Playgroud)

Quick'n'easy.谢谢大家,抱歉大脑放屁.

重用:

import time

current_milli_time = lambda: int(round(time.time() * 1000))
Run Code Online (Sandbox Code Playgroud)

然后:

>>> current_milli_time()
1378761833768
Run Code Online (Sandbox Code Playgroud)

  • 这可能无法给出正确的答案.根据文档,"请注意,即使时间总是作为浮点数返回,但并非所有系统都提供比1秒更精确的时间" (29认同)
  • @MaximVladimirsky Python的`int`方法实际上是`floor`s值,它不会围绕它们.因此,`round()``25.7`将按预期给我们`26`,但只是将它发送到`int()`将给我们`25`.很奇怪,但这只是事情的运作方式.有趣. (18认同)
  • IMO我会使用地板而不是圆形,但那只是我.如果有人问小时是什么时间,而且是7:32,他们可能想要的数字是7,而不是8. (13认同)
  • 我想知道,为什么你需要'回合'?好像`int(time.time()*1000)`就足够了? (10认同)
  • @MaximVladimirsky这不是int()的行为.Int不会设置值,它会向零舍入.对于正数而言,这是相同的事情,但对于负数则相反.int(1.5)给出1,int(-1.5)给出-1,math.floor(-1.5)给出-2参见:https://docs.python.org/2/library/stdtypes.html (9认同)
  • @davr 如果时间是 7:59 你会说 7 吗? (4认同)
  • @SkipHuffman 因为你永远不会得到当前时间的负数,所以你可以使用 `int(time.time() * 1000)`。 (3认同)

Jas*_*tes 84

time.time()可能只给第二个解决方案,毫秒的首选方法是datetime.

from datetime import datetime
dt = datetime.now()
dt.microsecond
Run Code Online (Sandbox Code Playgroud)

  • 不太有用 - 这只会给你**dt秒内的微秒**.请参阅http://stackoverflow.com/a/1905423/74632 (78认同)
  • -1.这是对这个问题的错误答案.正如@Boris评论的那样,这并没有给出"以微秒为单位的时间",例如不包括以微秒为单位的天,小时,秒. (9认同)
  • +1,因为这是从系统获得可靠时间戳的官方方式. (8认同)
  • 给出当前时间的微秒,而不是整个时间戳。 (8认同)
  • +1这给出了一个正确的值,并且可以假设算术起作用,因为数学.如果用户需要以毫秒/微秒为单位的当前时间,那么简单的算术就可以得到它们.如果需要时间增量 - 不要求 - 算术,再次,保存一天. (2认同)
  • @ja:它确实包括“天,小时,秒”(它解决了您评论中指出的问题)。为了解决*新*问题(闰秒):POSIX 时间不计算闰秒,并且 `time.time()` 在 Python 支持的大多数系统上返回 POSIX 时间(如果我们排除不常见的“正确”时区)。不要混淆精度和准确度——这个问题是关于毫秒精度的——如果您需要毫秒精度,那么您需要首先讨论时钟同步、ntp(LAN 与 WAN)等。 (2认同)

use*_*131 40

def TimestampMillisec64():
    return int((datetime.datetime.utcnow() - datetime.datetime(1970, 1, 1)).total_seconds() * 1000) 
Run Code Online (Sandbox Code Playgroud)

  • 您可以内联`.total_seconds()`的公式以产生(可能)更好的精度:[`(td.microseconds +(td.seconds + td.days * 86400)* 10 ** 6)/ 10 ** 3` (启用了真正的除法)](http://stackoverflow.com/a/8778548/4279)或如果要截断毫秒数,请使用“ // 10 ** 3”。 (3认同)

zar*_*sht 17

3.7版开始,您可以使用time.time_ns()从纪元开始经过十亿分之一秒的时间。所以你可以做

ms = time.time_ns() // 1000000 
Run Code Online (Sandbox Code Playgroud)

以毫秒为单位获取时间作为整数。

  • 要获取以毫秒为单位的时间,`time_ns()` 必须除以 1000000。此评论是对我之前评论(现已删除)的更正,以防止混淆。感谢@AbrahamTugalov 提出的澄清建议。 (5认同)

Wil*_* Wu 13

只是示例代码:

import time
timestamp = int(time.time()*1000.0)
Run Code Online (Sandbox Code Playgroud)

输出:1534343781311


Cad*_*dey 11

另一种解决方案是您可以嵌入到自己的utils.py中的功能

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


hoo*_*man 10

如果您使用我的代码(如下),时间将以秒为单位显示,然后在小数点后显示为毫秒。我认为 Windows 和 Unix 之间存在差异 - 如果有,请发表评论。

from time import time

x = time()
print(x)
Run Code Online (Sandbox Code Playgroud)

我的结果(在 Windows 上)是:

1576095264.2682993
Run Code Online (Sandbox Code Playgroud)

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


Pas*_*cal 9

如果你想在你的代码中使用一个简单的方法返回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
Run Code Online (Sandbox Code Playgroud)


Lay*_*ain 9

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

# timeutil.py
import datetime


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

# sample.py
import timeutil


timeutil.get_epochtime_ms()
Run Code Online (Sandbox Code Playgroud)


pho*_*ord 9

如果您担心测量经过的时间,则应使用单调时钟 (python 3)。该时钟不受系统时钟更新的影响,例如您会看到 NTP 查询是否调整了您的系统时间。

>>> import time
>>> millis = round(time.monotonic() * 1000)
Run Code Online (Sandbox Code Playgroud)

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


And*_*ner 8

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

time.perf_counter() -> float

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

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.")
Run Code Online (Sandbox Code Playgroud)


Sey*_*yfi 7

更新:感谢@neuralmer。

有效的方法 之一:

(time.time_ns() + 500000) // 1000000  #rounding last digit (1ms digit)
Run Code Online (Sandbox Code Playgroud)

或者

time.time_ns() // 1000000          #flooring last digit (1ms digit)
Run Code Online (Sandbox Code Playgroud)

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

基准:

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

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)```
Run Code Online (Sandbox Code Playgroud)


小智 5

在 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)
Run Code Online (Sandbox Code Playgroud)

随意使用您更喜欢的那个,我认为不需要比这更复杂的解决方案。