在 Python 中,datetime.timedelta 对象本身并不直接提供“年”作为单位,这是因为“年”的长度不是固定的(闰年有 366 天,平年有 365 天),而 timedelta 的设计是基于固定的时间单位(天、秒、微秒)。

你可以通过以下几种方法来近似地处理“年”:
方法 1:使用 365 天作为一年的近似值(最简单)
这是最直接的方法,但不够精确,因为它忽略了闰年。
from datetime import datetime, timedelta
# 假设要计算 2 年后的日期
years = 2
approx_days = years * 365
future_date = datetime.now() + timedelta(days=approx_days)
print(f"当前日期: {datetime.now().strftime('%Y-%m-%d')}")
print(f"{years} 年后的近似日期: {future_date.strftime('%Y-%m-%d')}")
缺点:每 4 年会误差 1 天。
方法 2:考虑闰年(更精确)
可以通过计算闰年数量来调整天数,但实现较复杂,更推荐使用 dateutil.relativedelta(见方法 3)。

方法 3:使用 dateutil.relativedelta(推荐)
dateutil 库的 relativedelta 支持“年”和“月”等不固定单位,是处理这类问题的最佳选择。
安装 dateutil:
pip install python-dateutil
示例代码:
from datetime import datetime
from dateutil.relativedelta import relativedelta
# 当前日期
now = datetime.now()
print(f"当前日期: {now.strftime('%Y-%m-%d')}")
# 加上 2 年
future_date = now + relativedelta(years=2)
print(f"2 年后的日期: {future_date.strftime('%Y-%m-%d')}")
# 加上 1 年 3 个月
future_date_mixed = now + relativedelta(years=1, months=3)
print(f"1 年 3 个月后的日期: {future_date_mixed.strftime('%Y-%m-%d')}")
优点:
- 正确处理闰年、月份天数差异。
- 支持“年”“月”“日”等混合操作。
方法 4:手动计算闰年(复杂但不依赖外部库)
如果不想用 dateutil,可以手动计算闰年数量来调整天数:
from datetime import datetime, timedelta
def add_years(start_date, years):
# 计算总天数(365 * 年数 + 闰年数)
total_days = 365 * years
# 计算闰年数量(简化版:每 4 年 1 个闰年)
leap_years = years // 4
total_days += leap_years
return start_date + timedelta(days=total_days)
now = datetime.now()
future_date = add_years(now, 2)
print(f"2 年后的日期(含闰年近似): {future_date.strftime('%Y-%m-%d')}")
缺点:闰年计算仍可能不完全准确(例如世纪年规则)。

| 方法 | 优点 | 缺点 |
|---|---|---|
timedelta(days=365*years) |
简单,无需依赖 | 忽略闰年,每 4 年误差 1 天 |
dateutil.relativedelta |
最精确,支持混合单位 | 需要安装第三方库 |
| 手动计算闰年 | 无需外部库 | 实现复杂,闰年计算可能不精确 |
推荐使用 dateutil.relativedelta,它是处理“年”“月”时间差的最佳实践。
