datetime.today()相减在Windows与Linux下结果不一致的技术咨询
问题原因及说明
这个差异的核心原因是系统时钟调整机制的不同,尤其是Linux系统可能出现的NTP时间回拨:
datetime.today()的本质
该方法获取的是系统的本地当前时间,两次调用之间存在微小的时间间隔。如果在这个间隔内系统时钟被NTP服务回拨(比如Linux系统发现时钟快了,直接将时间调回正确值),就会出现第二次调用得到的时间早于第一次的情况,导致时间差为负。Windows与Linux的差异
- Windows系统的时钟同步通常采用平滑调整的方式,不会直接回拨时间,因此两次
datetime.today()调用的时间几乎总是后一次晚于前一次,差值为0或极小的正timedelta。 - Linux(包括WSL2)默认的NTP服务可能会进行步进式时间调整,当系统时钟有偏差时直接回拨时间,这就导致第二次调用的时间可能比第一次早,计算出的差值表现为
timedelta(days=-1, seconds=86399, microseconds=999986)——这个值等价于-0.000014秒,只是timedelta的格式化方式让它看起来像差了一天。
- Windows系统的时钟同步通常采用平滑调整的方式,不会直接回拨时间,因此两次
验证与解决方法
- 验证:可以通过打印两次调用的时间戳确认是否存在时间回退:
from datetime import datetime t1 = datetime.today() t2 = datetime.today() print(t1.timestamp(), t2.timestamp()) print(t2 < t1) # 如果为True,说明时间回拨了 - 解决:如果需要不受系统时钟调整影响的时间差计算,应该使用单调时钟,比如
time.monotonic():import time start = time.monotonic() # 执行操作 end = time.monotonic() print(f"耗时:{end - start}秒")
- 验证:可以通过打印两次调用的时间戳确认是否存在时间回退:
内容的提问来源于stack exchange,提问作者jmangold
相关产品推荐
相关产品推荐

