Je souhaite calculer l'age d'une personne avec un affichage conditionnel
en fonction de celui ci.
si age < 3 mois on affiche le nombre de jours
si age < 1 an on affiche le nombre de mois
sinon on affiche l'age en année.
Voici ma fonction mais elle ne couvre pas tous les cas
import datetime
# date au format JJ/MM/AAAA
#CreateDateObject crée un objet datetime
def CalculerAgeEtLibelle( date, ref_date = Today() ):
age = ""
if date:
dn = CreateDateObject( date )
rd = CreateDateObject( ref_date )
diff = rd - dn
nb_jours = diff.days
if nb_jours < 90:
age = str(nb_jours) + " jour"
if nb_jours != 1:
age += "s"
elif diff.days < 365:
age = str(int( nb_jours / 30 )) + " mois"
else:
annee = int( nb_jours / 365.25 )
age = str(annee) + " an"
if annee != 1:
age += "s"
Si aujourd'hui == 18/07/2007
Ne marche pas pour date de naissance le 18/04/2007, la fonction devrait
me retourner 3 mois et non 90 jours.
Idem, je risque de rencontrer des soucis avec les années bissextiles.
Je n'ai rien trouvé dans les module datetime, si vous avez une idée,
merci !!!
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Jean-Baptiste renard
ReM wrote:
Bonjour,
Je souhaite calculer l'age d'une personne avec un affichage conditionnel en fonction de celui ci. si age < 3 mois on affiche le nombre de jours si age < 1 an on affiche le nombre de mois sinon on affiche l'age en année.
Voici ma fonction mais elle ne couvre pas tous les cas [SNIP] Si aujourd'hui == 18/07/2007 Ne marche pas pour date de naissance le 18/04/2007, la fonction devrait me retourner 3 mois et non 90 jours. Idem, je risque de rencontrer des soucis avec les années bissextiles.
Ton script me parait correct. il fonctionne chez moi. (modulo 2/3 corrections)
Juste le if nb_jours != 1: pose problème. en effet, si tu est né aujourd'hui, il te note 0 jours.
32 ans 3 mois 0 jours
import datetime from time import localtime def Today(): ( year, month, day, hour, min, sec, weekday, julianday, dummy ) localtime() return "%02d/%02d/%04d" %( day, month, year )
# date au format JJ/MM/AAAA #CreateDateObject cree un objet datetime def CalculerAgeEtLibelle( date, ref_date = Today() ): age = "" if date: dn = CreateDateObject( date ) rd = CreateDateObject( ref_date )
diff = rd - dn nb_jours = diff.days
if nb_jours < 90: age = str(nb_jours) + " jour" if nb_jours > 1: age += "s" elif diff.days < 365: age = str(int( nb_jours / 30 )) + " mois" else: annee = int( nb_jours / 365.25 ) age = str(annee) + " an" if annee != 1: age += "s"
Je souhaite calculer l'age d'une personne avec un affichage conditionnel
en fonction de celui ci.
si age < 3 mois on affiche le nombre de jours
si age < 1 an on affiche le nombre de mois
sinon on affiche l'age en année.
Voici ma fonction mais elle ne couvre pas tous les cas
[SNIP]
Si aujourd'hui == 18/07/2007
Ne marche pas pour date de naissance le 18/04/2007, la fonction devrait
me retourner 3 mois et non 90 jours.
Idem, je risque de rencontrer des soucis avec les années bissextiles.
Ton script me parait correct. il fonctionne chez moi. (modulo 2/3
corrections)
Juste le if nb_jours != 1: pose problème. en effet, si tu est né
aujourd'hui, il te note 0 jours.
32 ans
3 mois
0 jours
import datetime
from time import localtime
def Today():
( year, month, day, hour, min, sec, weekday, julianday, dummy ) localtime()
return "%02d/%02d/%04d" %( day, month, year )
# date au format JJ/MM/AAAA
#CreateDateObject cree un objet datetime
def CalculerAgeEtLibelle( date, ref_date = Today() ):
age = ""
if date:
dn = CreateDateObject( date )
rd = CreateDateObject( ref_date )
diff = rd - dn
nb_jours = diff.days
if nb_jours < 90:
age = str(nb_jours) + " jour"
if nb_jours > 1:
age += "s"
elif diff.days < 365:
age = str(int( nb_jours / 30 )) + " mois"
else:
annee = int( nb_jours / 365.25 )
age = str(annee) + " an"
if annee != 1:
age += "s"
Je souhaite calculer l'age d'une personne avec un affichage conditionnel en fonction de celui ci. si age < 3 mois on affiche le nombre de jours si age < 1 an on affiche le nombre de mois sinon on affiche l'age en année.
Voici ma fonction mais elle ne couvre pas tous les cas [SNIP] Si aujourd'hui == 18/07/2007 Ne marche pas pour date de naissance le 18/04/2007, la fonction devrait me retourner 3 mois et non 90 jours. Idem, je risque de rencontrer des soucis avec les années bissextiles.
Ton script me parait correct. il fonctionne chez moi. (modulo 2/3 corrections)
Juste le if nb_jours != 1: pose problème. en effet, si tu est né aujourd'hui, il te note 0 jours.
32 ans 3 mois 0 jours
import datetime from time import localtime def Today(): ( year, month, day, hour, min, sec, weekday, julianday, dummy ) localtime() return "%02d/%02d/%04d" %( day, month, year )
# date au format JJ/MM/AAAA #CreateDateObject cree un objet datetime def CalculerAgeEtLibelle( date, ref_date = Today() ): age = "" if date: dn = CreateDateObject( date ) rd = CreateDateObject( ref_date )
diff = rd - dn nb_jours = diff.days
if nb_jours < 90: age = str(nb_jours) + " jour" if nb_jours > 1: age += "s" elif diff.days < 365: age = str(int( nb_jours / 30 )) + " mois" else: annee = int( nb_jours / 365.25 ) age = str(annee) + " an" if annee != 1: age += "s"
Il vaut mieux calculer à partir des jours, mois et années des deux dates plutôt que sur la différence entre les deux dates (instance de datetime.timedelta) : c'est très difficile à partir des jours de retrouver des jours / mois / ans (une période de 3 mois peut aller de 89 à 92 jours sauf erreur)
Le jour courant est donné par datetime.date.today() La méthode strftime() définit la représentation d'une date sous forme de chaîne
"""les parametres sont des chaines de caracteres representant la date de naissance et une date de reference, par defaut aujourd'hui"""
# instance de datetime.date pour naissance jour,mois,an = [ int(x) for x in naissance_str.split("/") ] naissance = datetime.date(an,mois,jour)
# instance de datetime.date pour date ref j,m,a = [ int(x) for x in ref_date_str.split("/") ] ref_date = datetime.date(a,m,j)
# date des 3 mois date_3_mois = datetime.date(an+(mois+3)/12,(mois+3)%12,jour) # date du 1er anniversaire date_1_an = datetime.date(an+1,mois,jour)
# on traite les differents cas if ref_date < date_3_mois: age_jours = ref_date-naissance # instance de timedelta if age_jours.days > 1: return "%s jours" %age_jours else: return "1 jour" elif ref_date<date_1_an: # age en mois delta_mois = (ref_date.month-naissance.month) + 12*(ref_date.year-naissance.year) # correctif en fonction du jour dans le mois correctif = int(ref_date.day<naissance.day) return "%s mois" %(delta_mois - correctif) else: # age en annees delta_ans = ref_date.year-naissance.year # correctif si la date de l'anniversaire n'est pas atteinte anniv = datetime.date(naissance.year +delta_ans,naissance.month,naissance.day) correctif = int(anniv>ref_date) # 1 si anniversaire non atteint, 0 sinon age_ans = delta_ans - correctif if age_ans > 1: return "%s ans" %age_ans else: return "1 an"
A+ Pierre
Bonjour,
Il vaut mieux calculer à partir des jours, mois et années des deux
dates plutôt que sur la différence entre les deux dates (instance de
datetime.timedelta) : c'est très difficile à partir des jours de
retrouver des jours / mois / ans (une période de 3 mois peut aller de
89 à 92 jours sauf erreur)
Le jour courant est donné par datetime.date.today()
La méthode strftime() définit la représentation d'une date sous forme
de chaîne
"""les parametres sont des chaines de caracteres representant
la date de naissance et une date de reference, par defaut
aujourd'hui"""
# instance de datetime.date pour naissance
jour,mois,an = [ int(x) for x in naissance_str.split("/") ]
naissance = datetime.date(an,mois,jour)
# instance de datetime.date pour date ref
j,m,a = [ int(x) for x in ref_date_str.split("/") ]
ref_date = datetime.date(a,m,j)
# date des 3 mois
date_3_mois = datetime.date(an+(mois+3)/12,(mois+3)%12,jour)
# date du 1er anniversaire
date_1_an = datetime.date(an+1,mois,jour)
# on traite les differents cas
if ref_date < date_3_mois:
age_jours = ref_date-naissance # instance de timedelta
if age_jours.days > 1:
return "%s jours" %age_jours
else:
return "1 jour"
elif ref_date<date_1_an:
# age en mois
delta_mois = (ref_date.month-naissance.month) +
12*(ref_date.year-naissance.year)
# correctif en fonction du jour dans le mois
correctif = int(ref_date.day<naissance.day)
return "%s mois" %(delta_mois - correctif)
else:
# age en annees
delta_ans = ref_date.year-naissance.year
# correctif si la date de l'anniversaire n'est pas atteinte
anniv = datetime.date(naissance.year
+delta_ans,naissance.month,naissance.day)
correctif = int(anniv>ref_date) # 1 si anniversaire non
atteint, 0 sinon
age_ans = delta_ans - correctif
if age_ans > 1:
return "%s ans" %age_ans
else:
return "1 an"
Il vaut mieux calculer à partir des jours, mois et années des deux dates plutôt que sur la différence entre les deux dates (instance de datetime.timedelta) : c'est très difficile à partir des jours de retrouver des jours / mois / ans (une période de 3 mois peut aller de 89 à 92 jours sauf erreur)
Le jour courant est donné par datetime.date.today() La méthode strftime() définit la représentation d'une date sous forme de chaîne
"""les parametres sont des chaines de caracteres representant la date de naissance et une date de reference, par defaut aujourd'hui"""
# instance de datetime.date pour naissance jour,mois,an = [ int(x) for x in naissance_str.split("/") ] naissance = datetime.date(an,mois,jour)
# instance de datetime.date pour date ref j,m,a = [ int(x) for x in ref_date_str.split("/") ] ref_date = datetime.date(a,m,j)
# date des 3 mois date_3_mois = datetime.date(an+(mois+3)/12,(mois+3)%12,jour) # date du 1er anniversaire date_1_an = datetime.date(an+1,mois,jour)
# on traite les differents cas if ref_date < date_3_mois: age_jours = ref_date-naissance # instance de timedelta if age_jours.days > 1: return "%s jours" %age_jours else: return "1 jour" elif ref_date<date_1_an: # age en mois delta_mois = (ref_date.month-naissance.month) + 12*(ref_date.year-naissance.year) # correctif en fonction du jour dans le mois correctif = int(ref_date.day<naissance.day) return "%s mois" %(delta_mois - correctif) else: # age en annees delta_ans = ref_date.year-naissance.year # correctif si la date de l'anniversaire n'est pas atteinte anniv = datetime.date(naissance.year +delta_ans,naissance.month,naissance.day) correctif = int(anniv>ref_date) # 1 si anniversaire non atteint, 0 sinon age_ans = delta_ans - correctif if age_ans > 1: return "%s ans" %age_ans else: return "1 an"