你需要不止一个timedelta来说明多少年过去了;你还需要知道开始(或结束)日期。(这是闰年的事。)
最好的方法是使用dateutil.relativedeltaobject,但这是第三方模块。如果您想知道从某个日期起的datetime年(默认为现在),可以执行以下操作:from dateutil.relativedelta import relativedelta
def yearsago(years, from_date=None):
if from_date is None:
from_date = datetime.now()
return from_date - relativedelta(years=years)
如果你愿意坚持使用标准库,答案就更复杂了:from datetime import datetime
def yearsago(years, from_date=None):
if from_date is None:
from_date = datetime.now()
try:
return from_date.replace(year=from_date.year - years)
except ValueError:
# Must be 2/29!
assert from_date.month == 2 and from_date.day == 29 # can be removed
return from_date.replace(month=2, day=28,
year=from_date.year-years)
如果是2/29,而18年前没有2/29,这个函数将返回2/28。如果您希望返回3/1,只需将最后一个return语句改为:return from_date.replace(month=3, day=1,
year=from_date.year-years)
你的问题本来是想知道从某个日期到现在有多少年了。假设您需要整数年数,可以根据每年365.25天进行猜测,然后使用上面定义的yearsago函数之一进行检查:def num_years(begin, end=None):
if end is None:
end = datetime.now()
num_years = int((end - begin).days / 365.25)
if begin > yearsago(num_years, end):
return num_years - 1
else:
return num_years