【问题标题】:Get current time in milliseconds in Python?在 Python 中以毫秒为单位获取当前时间?
【发布时间】:2011-08-25 06:57:37
【问题描述】:

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

【问题讨论】:

  • import time; ms = time.time()*1000.0
  • @samplebias: time.time() 在某些平台和 python 版本上可能提供比 datetime.utcnow() 更差的精度。
  • 何时以来的毫秒数?如果您的意思是从纪元(UTC 时间 1970 年 1 月 1 日午夜)开始,请参阅:stackoverflow.com/questions/18169099/…
  • 对于真正的微秒分辨率毫秒时间戳,请参见此处:stackoverflow.com/questions/38319606/…

标签: python datetime time


【解决方案1】:

使用time.time()

import time

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

然后:

>>> current_milli_time()
1378761833768

【讨论】:

  • 这可能不会给出正确的答案。根据文档,“请注意,尽管时间始终以浮点数形式返回,但并非所有系统都提供比 1 秒更好的精度”
  • 我在想,你为什么需要round?看来int(time.time() * 1000)够了吗?
  • IMO 我会使用地板而不是圆形,但这只是我。如果有人问几点钟是 7:32,他们可能想要的数字是 7,而不是 8。
  • @ParallelUniverse:.utcnow() uses GetSystemTimeAsFileTime() on recent CPython on Windowstime.clock() 呼叫 (QueryPerformanceCounter()) 不会引入比它可能减少的更多的噪音吗?见Precision is not the same as accuracy
  • @MaximVladimirsky 这不是 int() 的行为。 Int 不会对值进行下限,它会向零舍入。这对于正数是一样的,但对于负数则相反。 int(1.5) 给出 1,int(-1.5) 给出 -1,math.floor(-1.5) 给出 -2 参见:docs.python.org/2/library/stdtypes.html
【解决方案2】:

version 3.7,您可以使用time.time_ns() 获取从纪元开始经过纳秒的时间。 所以你可以做

ms = time.time_ns() // 1_000_000 

以毫秒为单位获取整数。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 不是很有用 - 这只会给你 dt 秒内的微秒。见stackoverflow.com/a/1905423/74632
    • +1 因为这是从系统获取可靠时间戳的官方方式。
    • -1。这是对这个问题的错误答案。正如@Boris 评论的那样,这并没有给出“以微秒为单位的时间”,例如不包括以微秒为单位的天、小时、秒。
    • +1 这给出了一个正确的值,并且可以假设算术可以工作,因为数学。如果用户需要以毫秒/微秒为单位的当前时间,简单的算术将得到它们。如果需要时间增量 - 不需要 - 算术,再次节省一天。
    • 给出当前时间的微秒,而不是整个时间戳。
    【解决方案4】:
    def TimestampMillisec64():
        return int((datetime.datetime.utcnow() - datetime.datetime(1970, 1, 1)).total_seconds() * 1000) 
    

    【讨论】:

    • 您可以内联.total_seconds() 的公式以产生(可能)更好的精度:(td.microseconds + (td.seconds + td.days * 86400) * 10**6) / 10**3 (with true division enabled) 或者如果您想截断毫秒然后使用// 10**3
    • 如果使用日期时间,这似乎是最好的答案
    • 如果您将此作为跨平台 python 解决方案展示,是否可以保证所有平台和所有 python 版本 3+ 将正确解释 datetime.datetime 返回的任何过去的闰秒。 utcnow(),或者作为一致的跨平台解决方案是否存在潜在的困难?
    【解决方案5】:

    只是示例代码:

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

    输出: 1534343781311

    【讨论】:

    • time.time() 不保证操作系统支持秒的分数
    【解决方案6】:

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

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

    【讨论】:

      【解决方案7】:

      如果您想在代码中使用一个简单的方法来返回带有日期时间的毫秒数:

      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
      

      【讨论】:

      • 这是以毫秒为单位的两次之间的差异,将您的方法与@Jason 的答案相结合会给出以毫秒为单位的当前时间戳...考虑一下,UNIX 时间戳将是您使用start_time 的方法= 日期时间(1970,1,1)
      • 本地时间可能不明确且不单调(由于 DST 转换或其他原因更改本地 UTC 偏移量)。请改用.utcnow(),或者如果您不需要绝对时间,则可以使用time.monotonous()。注意:some_int + dt.microseconds/ 1000.0 和启用真除法的公式( ) / 10**3 之间的浮点运算存在细微差别。见the explicit formula and the link for total_seconds() in the related answer
      【解决方案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.")
      

      【讨论】:

      • 那么不可能以这种精度获得当前时代?
      • 我不这么认为。使用time.time_ns() 是最好的选择,但它有不同的保证。
      【解决方案9】:

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

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

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

      【讨论】:

        【解决方案10】:

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

        from time import time
        
        x = time()
        print(x)
        

        我的结果(在 Windows 上)是:

        1576095264.2682993
        

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

        【讨论】:

        • Mac OSX 上没有差异:/usr/local/opt/python/bin/python3.7 scratch.py 1577212639.882543
        • 在 Ubuntu 18 上没有差异:python3 scratch.py 1577212763.9136133
        【解决方案11】:

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

        # timeutil.py
        import datetime
        
        
        def get_epochtime_ms():
            return round(datetime.datetime.utcnow().timestamp() * 1000)
        
        # sample.py
        import timeutil
        
        
        timeutil.get_epochtime_ms()
        

        【讨论】:

          【解决方案12】:

          在 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)
          

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

          【讨论】:

            【解决方案13】:

            更新:感谢@neuralmer。

            高效方法之一:

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

            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)```
            

            【讨论】:

            • OP 正在寻找毫秒,通过仅除以 1000,您提供的是微秒。 (毫、微米、纳米)
            • 非常感谢@neuralmer。更新了答案并重新对整个代码进行了基准测试。
            【解决方案14】:

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

            例如: 在美国,往返 ping 的时间为 30-80 毫秒...您不能只是将其四舍五入并有效地使用它。

            我自己的示例要求每秒执行一次任务,这意味着如果我在第一个任务响应后四舍五入,我仍然会导致处理时间乘以每个主循环周期。这最终成为每 60 秒一次的总函数调用。每天大约 1440 次。不太准确。

            对于那些寻求更准确推理的人们来说只是一个想法,而不是解决从未真正使用过的数据库差距。

            【讨论】:

            • 您有更好的解决方案吗?也老实说,我完全不明白你在说什么。你所说的“四舍五入”是什么意思?
            • 用一个实际例子来解释你的解决方案,以便更好地理解
            【解决方案15】:

            自 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='')
            

            感谢您的宝贵时间

            【讨论】:

              【解决方案16】:

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

              round(datetime.datetime.timestamp(datetime.datetime.now()) * 1000)

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-10-25
                • 2017-02-20
                • 1970-01-01
                • 2017-04-25
                • 1970-01-01
                • 1970-01-01
                • 2015-09-22
                相关资源
                最近更新 更多