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
相关产品推荐
相关产品推荐

