Malheureusement, vous ne pouvez pas simplement utiliser timedelata car la plus grande unité qu'il utilise est le jour et les années bissextiles rendront vos calculs invalides. Par conséquent, trouvons le nombre d'années puis ajustons d'une unité si la dernière année n'est pas complète :
from datetime import date
birth_date = date(1980, 5, 26)
years = date.today().year - birth_date.year
if (datetime.now() - birth_date.replace(year=datetime.now().year)).days >= 0:
age = years
else:
age = years - 1
Mise à jour :
Cette solution provoque vraiment une exception lorsque le 29 février entre en jeu. Voici la vérification correcte :
from datetime import date
birth_date = date(1980, 5, 26)
today = date.today()
years = today.year - birth_date.year
if all((x >= y) for x,y in zip(today.timetuple(), birth_date.timetuple()):
age = years
else:
age = years - 1
Mise à jour 2 :
L'appel multiple à now()
une baisse de performance est ridicule, cela n'a aucune importance sauf dans des cas extrêmement particuliers. La véritable raison d'utiliser une variable est le risque d'incohérence des données.
5 votes
Lorsque la norme
datetime
n'est pas suffisant, vous pouvez essayer : labix.org/python-dateutil3 votes
Cela a presque certainement été résolu par :
dateutil.relativedelta.relativedelta