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

Python中连续调用datetime.now()差值为何返回86399而非0?

为什么连续调用datetime.datetime.now()计算差值的seconds属性会得到86399?

问题现象

直接连续调用datetime.datetime.now()并计算差值的seconds属性,返回结果为86399而非预期的0:

import datetime

print((datetime.datetime.now() - datetime.datetime.now()).seconds)  # 返回86399

但将两次调用结果分别赋值给变量后再计算,结果符合预期为0:

import datetime as dt
a = dt.datetime.now()
b = dt.datetime.now()
print((b - a).seconds)  # 返回0

技术原因分析

1. 表达式求值顺序差异

Python在计算二元表达式x - y时,会先计算左操作数x,再计算右操作数y:

  • 连续调用的代码中,先执行左边的datetime.datetime.now()得到时间T1,再执行右边的datetime.datetime.now()得到时间T2,最终计算T1 - T2。
  • 如果两次调用刚好跨午夜(0点),T1是前一天的23:59:59左右,T2是第二天的00:00:00左右,此时T1 - T2的结果是一个负的时间差(约-1秒)。

2. timedelta.seconds属性的特性

Python的timedelta对象存储时间差时,会将负的时间差转换为负天数 + 正的秒数/微秒数的形式,且seconds属性始终返回0到86399之间的整数(一天总秒数为86400):

  • 例如,timedelta(seconds=-1)会被内部表示为timedelta(days=-1, seconds=86399),调用.seconds时就会返回86399。
  • 分开赋值的代码中,b是后调用的时间,b - a是正的微小时间差(通常只有几微秒),其seconds属性取整数部分,自然为0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 15:22:14