Вам нужно больше, чем timedelta
, чтобы сказать, сколько лет прошло; Вам также нужно знать дату начала (или окончания). (Это високосный год.)
Лучше всего использовать объект dateutil.relativedelta
, но это сторонний модуль. Если вы хотите узнать datetime
, который был 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 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