我需要检查自某个日期以来是否已有几年。目前我已经timedelta从datetime模块中获得,我不知道如何将其转换为年。
timedelta
datetime
你需要不止一个timedelta来判断已经过去了多少年;您还需要知道开始(或结束)日期。(这是闰年的事情。)
您最好的选择是使用dateutil.relativedelta object,但这是一个 3rd 方模块。如果您想知道从某个日期算起的datetime年份n(默认为现在),您可以执行以下操作:
dateutil.relativedelta
n
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
return from_date.replace(month=3, day=1, year=from_date.year-years)
您的问题最初是说您想知道距某个日期已有多少年了。假设您想要整数年,您可以根据每年 365.2425 天进行猜测,然后使用yearsago上面定义的任一函数进行检查:
yearsago
def num_years(begin, end=None): if end is None: end = datetime.now() num_years = int((end - begin).days / 365.2425) if begin > yearsago(num_years, end): return num_years - 1 else: return num_years