You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows下连续调用datetime.now()为何返回相同结果?

为什么连续调用datetime.now()会返回相同结果?

这个问题其实和Windows系统的时钟精度密切相关,咱们一步步拆解来看:

核心原因

在Windows系统上,Python的datetime.datetime.now()底层调用的是系统API GetLocalTime,而这个API的默认精度大概在10-15毫秒之间。也就是说,系统时钟并不是连续流动的,而是每隔10-15毫秒才会更新一次时间戳。

当你连续调用datetime.now()时,代码执行速度极快,两次调用的间隔远远小于10毫秒,所以它们读取到的都是系统时钟上一次更新后的同一个时间值,自然输出完全相同。

而你加了sleep(0.0001)之后,虽然看起来只休眠了0.1毫秒,但系统会让当前线程让出CPU,这段时间里系统时钟刚好完成了一次更新(毕竟15毫秒的间隔比0.1毫秒大得多),所以再次调用datetime.now()时就拿到了新的时间戳,也就出现了约0.015秒的差异——这个差值其实就是Windows系统时钟的更新间隔。

解决方案:获取更高精度的当前时间

如果你的场景需要更高精度的墙上时间(即真实的当前时间,而非时间间隔),可以试试以下几种方式:

  1. 使用time.time_ns()(Python 3.7+)
    这个函数返回自纪元以来的纳秒数,精度比datetime.now()高得多,你可以把它转换为datetime对象:

    import datetime
    import time
    
    def get_high_precision_dt_str():
        dt = datetime.datetime.fromtimestamp(time.time_ns() / 1e9)
        return dt.strftime("%Y-%m-%d %H:%M:%S.%f %Z")
    
  2. 调用Windows高精度API(进阶)
    通过ctypes直接调用Windows的QueryPerformanceCounter和QueryPerformanceFrequency来获取高精度时间,但需要自己转换为墙上时间,适合对精度要求极高的场景。

  3. 使用datetime.datetime.utcnow()配合高精度时间戳
    本质和第一种方式类似,只是基于UTC时间,避免时区问题:

    def get_utc_high_precision_dt_str():
        dt = datetime.datetime.utcfromtimestamp(time.time_ns() / 1e9)
        return dt.strftime("%Y-%m-%d %H:%M:%S.%f UTC")
    

补充说明

你提到Python官方文档没提这个问题,是因为这属于系统依赖的行为,Python本身只是封装了系统提供的时间接口,不同操作系统的时钟精度不一样:比如Linux系统的时钟精度通常能达到微秒级,连续调用datetime.now()就会看到不同的结果。


内容的提问来源于stack exchange,提问作者Laurence W

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:28:20