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

Python中relativedelta与datetime库日期计算的异常问题咨询

分四次加3个月与一次性加12个月结果不同的原因

核心差异来自dateutil.relativedelta对月末日期的调整逻辑:当原日期是当月最后一天,而目标月份没有对应天数时,relativedelta会自动将日期修正为目标月份的最后一天,多次叠加后会产生累积偏差。

分步计算过程拆解

初始日期:2020-07-31

  1. 第一次加3个月:2020-07-31 → 2020-10-31(10月有31天,无调整)
  2. 第二次加3个月:2020-10-31 → 2021-01-31(1月有31天,无调整)
  3. 第三次加3个月:2021-01-31 → 2021-04-30(4月只有30天,自动调整为月末)
  4. 第四次加3个月:2021-04-30 → 2021-07-30(从4月30日加3个月,直接对应7月30日,无月末修正触发)

而一次性加12个月时,relativedelta会直接校验目标年份的对应月份:2021年7月有31天,因此直接返回2021-07-31,没有中间步骤的调整偏差。

解决方法

如果需要每次加3个月都保留月末属性,可以通过强制指定day=31来确保结果始终是当月最后一天:

import datetime as dt
import dateutil.relativedelta as rd

d = dt.date(2020, 7, 31)
for _ in range(4):
    d += rd.relativedelta(months=+3, day=31)
print(d)  # 输出 2021-07-31

# 或直接使用一次性加12个月的方式(业务逻辑允许的情况下)
print(dt.date(2020, 7, 31) + rd.relativedelta(months=+12))  # 输出 2021-07-31

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 14:21:18