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系统时钟的更新间隔。
解决方案:获取更高精度的当前时间
如果你的场景需要更高精度的墙上时间(即真实的当前时间,而非时间间隔),可以试试以下几种方式:
使用
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")调用Windows高精度API(进阶)
通过ctypes直接调用Windows的QueryPerformanceCounter和QueryPerformanceFrequency来获取高精度时间,但需要自己转换为墙上时间,适合对精度要求极高的场景。使用
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

