Python datetime时间相减负差值显示异常是bug还是预设特性?
问题判定
这个现象不是bug,属于Python datetime 模块的预设设计特性。
设计逻辑说明
- 两个
datetime对象相减得到的timedelta类型,内部存储遵循固定规范:仅days属性允许为负数,seconds、microseconds属性永远保持非负取值。 - 你观察到的
-1 day, 18:50:00实际数值等价于-24小时 + 18小时50分钟 = -5小时10分钟,和预期的计算结果完全一致,差异仅在于默认的字符串展示格式不符合直觉。
自定义格式化解决方案
如果需要输出和直觉一致的正负时分格式,可以自行封装timedelta格式化函数,参考实现如下:
def format_timedelta(td): total_sec = int(td.total_seconds()) prefix = "-" if total_sec < 0 else "" abs_sec = abs(total_sec) hours = abs_sec // 3600 minutes = (abs_sec % 3600) // 60 return f"{prefix}{hours}h{minutes}m" # 代入测试代码 import datetime dep = datetime.datetime(2021, 9, 11, 7, 25) arr = datetime.datetime(2021, 9, 11, 12, 35) print(f"expected: -5h10m, real: {format_timedelta(dep - arr)}") print(f"expected: 5h10m, real: {format_timedelta(arr - dep)}")
运行后输出结果:
expected: -5h10m, real: -5h10m expected: 5h10m, real: 5h10m
内容的提问来源于stack exchange,提问作者Petr Dvořáček
相关产品推荐
相关产品推荐

