Вот решение, позволяющее определить возраст человека по годам, месяцам или дням.
Допустим, дата рождения человека 2012-01-17T00: 00: 00
Таким образом, его возраст 2013-01-16T00: 00: 00 будет 11 месяцев
или если он родился 2012-12-17T00: 00: 00 ,
его возраст на 2013-01-12T00: 00: 00 будет 26 дней
или если он родился 2000-02-29T00: 00: 00 ,
его возраст 2012-02-29T00: 00: 00 будет 12 лет
Вам понадобится import datetime .
Вот код:
def get_person_age(date_birth, date_today):
"""
At top level there are three possibilities : Age can be in days or months or years.
For age to be in years there are two cases: Year difference is one or Year difference is more than 1
For age to be in months there are two cases: Year difference is 0 or 1
For age to be in days there are 4 possibilities: Year difference is 1(20-dec-2012 - 2-jan-2013),
Year difference is 0, Months difference is 0 or 1
"""
years_diff = date_today.year - date_birth.year
months_diff = date_today.month - date_birth.month
days_diff = date_today.day - date_birth.day
age_in_days = (date_today - date_birth).days
age = years_diff
age_string = str(age) + " years"
# age can be in months or days.
if years_diff == 0:
if months_diff == 0:
age = age_in_days
age_string = str(age) + " days"
elif months_diff == 1:
if days_diff < 0:
age = age_in_days
age_string = str(age) + " days"
else:
age = months_diff
age_string = str(age) + " months"
else:
if days_diff < 0:
age = months_diff - 1
else:
age = months_diff
age_string = str(age) + " months"
# age can be in years, months or days.
elif years_diff == 1:
if months_diff < 0:
age = months_diff + 12
age_string = str(age) + " months"
if age == 1:
if days_diff < 0:
age = age_in_days
age_string = str(age) + " days"
elif days_diff < 0:
age = age-1
age_string = str(age) + " months"
elif months_diff == 0:
if days_diff < 0:
age = 11
age_string = str(age) + " months"
else:
age = 1
age_string = str(age) + " years"
else:
age = 1
age_string = str(age) + " years"
# The age is guaranteed to be in years.
else:
if months_diff < 0:
age = years_diff - 1
elif months_diff == 0:
if days_diff < 0:
age = years_diff - 1
else:
age = years_diff
else:
age = years_diff
age_string = str(age) + " years"
if age == 1:
age_string = age_string.replace("years", "year").replace("months", "month").replace("days", "day")
return age_string
Некоторые дополнительные функции, используемые в вышеприведенных кодах:
def get_todays_date():
"""
This function returns todays date in proper date object format
"""
return datetime.now()
И
def get_date_format(str_date):
"""
This function converts string into date type object
"""
str_date = str_date.split("T")[0]
return datetime.strptime(str_date, "%Y-%m-%d")
Теперь нам нужно передать get_date_format () строками типа 2000-02-29T00: 00: 00
Он преобразует его в объект типа даты, который необходимо передать в get_person_age (date_birth, date_today) .
Функция get_person_age (date_birth, date_today) возвращает возраст в строковом формате.