Vous avez besoin de plus qu'un timedelta
pour savoir combien d'années se sont écoulées ; vous devez également connaître la date de début (ou de fin). (C'est une question d'année bissextile).
Votre meilleure chance est d'utiliser le dateutil.relativedelta
objet mais il s'agit d'un module tiers. Si vous voulez connaître le datetime
qui était n
ans à partir d'une certaine date (par défaut, maintenant), vous pouvez faire ce qui suit: :
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)
Si vous préférez vous en tenir à la bibliothèque standard, la réponse est un peu plus complexe: :
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)
Si nous sommes le 29 février et qu'il y a 18 ans, le 29 février n'existait pas, cette fonction renverra le 28 février. Si vous préférez renvoyer 3/1, il suffit de modifier le dernier paramètre de la fonction return
déclaration à lire : :
return from_date.replace(month=3, day=1,
year=from_date.year-years)
Votre question disait à l'origine que vous vouliez savoir combien d'années s'étaient écoulées depuis une date donnée. En supposant que vous vouliez un nombre entier d'années, vous pouvez deviner en vous basant sur 365,2425 jours par an, puis vérifier en utilisant l'une des méthodes suivantes yearsago
fonctions définies ci-dessus: :
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
4 votes
Voir cette réponse : stackoverflow.com/a/9754466/65387
0 votes
Liés : Comment convertir les années en secondes