Python 3中datetime对象差值计算不符合预期问题求助
Python datetime 减法结果不符合预期的问题解决
问题根源
你用(x - y).seconds得到的结果不符合预期,是因为timedelta.seconds这个属性的设计就是只返回时间差里时、分、秒部分的总秒数,完全不包含天数部分。而且如果时间差是负数(比如x比y早),它会自动转成基于一天86400秒的正数剩余值——比如你第二个例子里的86160,其实是86400减去4分钟的240秒得到的,本质是23小时56分钟的秒数,而不是你以为的负数差值。
正确的计算方式
要拿到包含天数的完整时间差,有几种实用方法:
1. 直接获取总秒数
用timedelta.total_seconds()方法,它会把天数也转换成秒数,返回整个时间差的总秒数:
import datetime x = datetime.datetime.strptime('11 Nov 2022 17:36', '%d %b %Y %H:%M') y = datetime.datetime.strptime('10 Nov 2022 17:30', '%d %b %Y %H:%M') print((x - y).total_seconds()) # 输出 86760.0,对应1天+6分钟 y = datetime.datetime.strptime('10 Nov 2022 17:40', '%d %b %Y %H:%M') print((x - y).total_seconds()) # 输出 86160.0,对应1天-4分钟(也就是23小时56分钟)
2. 拆分天数和秒数手动计算
如果你需要分开处理天数和剩余时间,可以直接取timedelta.days和timedelta.seconds,再组合计算:
import datetime x = datetime.datetime.strptime('11 Nov 2022 17:36', '%d %b %Y %H:%M') y = datetime.datetime.strptime('10 Nov 2022 17:30', '%d %b %Y %H:%M') delta = x - y total_seconds = delta.days * 86400 + delta.seconds print(total_seconds) # 86760 y = datetime.datetime.strptime('10 Nov 2022 17:40', '%d %b %Y %H:%M') delta = x - y total_seconds = delta.days * 86400 + delta.seconds print(total_seconds) # 86160
3. 处理带符号的时间差
如果x比y早,delta.days会是负数,delta.seconds始终是非负的,这样计算出来的总秒数会是负数,能准确体现时间差的方向:
import datetime x = datetime.datetime.strptime('10 Nov 2022 17:30', '%d %b %Y %H:%M') y = datetime.datetime.strptime('11 Nov 2022 17:36', '%d %b %Y %H:%M') delta = x - y total_seconds = delta.days * 86400 + delta.seconds print(total_seconds) # -86760
总结
别再用timedelta.seconds拿完整时间差了,它只负责时分秒部分。要完整差值就用total_seconds(),或者手动组合天数和秒数,这样就能得到你预期的结果了。
内容的提问来源于stack exchange,提问作者Rick Kohrs
相关产品推荐
相关产品推荐

