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

使用dateutil.relativedelta计算时间差输出始终为0是什么原因?

问题原因
  • 核心错误1:代码中t1和t2的解析逻辑完全相同,都取了每行拆分后的前两个元素(即每行的第一个日期时间),两个变量存储的是完全相同的时间,差值自然为0。
  • 逻辑问题2:dateutil.relativedelta的seconds属性仅返回差值的秒数部分,不是两个时间的总秒差,跨天/跨年的差值会分别存储在days、years等独立属性中,不会被统计到seconds里。
  • 参数顺序问题:relativedelta的参数顺序为relativedelta(较晚时间, 较早时间),顺序写反会得到负的差值。
修复方案

根据需求选择以下两种方案即可:

方案1:需要获取按年/月/日/时/分/秒拆分的差值

修正时间解析逻辑,正确读取每行的第二个日期时间,示例代码如下:

import dateutil.relativedelta, datetime
    
with open("data", "r") as f:
    for line in f:
        parts = line.strip().split()
        # 正确解析两个时间
        t1 = datetime.datetime.strptime(f"{parts[0]} {parts[1]}", "%m/%d/%Y %H:%M:%S")
        t2 = datetime.datetime.strptime(f"{parts[2]} {parts[3]}", "%m/%d/%Y %H:%M:%S")
        rd = dateutil.relativedelta.relativedelta(t2, t1)
        # 示例输出完整差值,可按需取对应属性
        print(f"相差{rd.years}年{rd.months}月{rd.days}天{rd.hours}时{rd.minutes}分{rd.seconds}秒")

方案2:需要获取两个时间的总秒差值

直接用datetime对象相减得到timedelta,调用total_seconds()方法即可,无需引入relativedelta,示例代码如下:

import datetime
    
with open("data", "r") as f:
    for line in f:
        parts = line.strip().split()
        t1 = datetime.datetime.strptime(f"{parts[0]} {parts[1]}", "%m/%d/%Y %H:%M:%S")
        t2 = datetime.datetime.strptime(f"{parts[2]} {parts[3]}", "%m/%d/%Y %H:%M:%S")
        diff_seconds = (t2 - t1).total_seconds()
        print(diff_seconds)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 16:54:02