La réponse simple à cette question est d'appliquer AddYears
comme indiqué ci-dessous car c'est la seule méthode native pour ajouter des années au 29 février des années bissextiles et obtenir le résultat correct du 28 février pour les années communes.
Certains pensent que le 1er mars est l'anniversaire des bissextiles, mais ni .Net ni aucune règle officielle ne le confirme, et la logique commune n'explique pas pourquoi certaines personnes nées en février devraient avoir 75% de leur anniversaire dans un autre mois.
En outre, une méthode d'âge se prête à être ajoutée comme une extension de la méthode d'âge. DateTime
. Vous pouvez ainsi obtenir l'âge de la manière la plus simple possible :
- Élément de liste
int age = birthDate.Age() ;
public static class DateTimeExtensions
{
/// <summary>
/// Calculates the age in years of the current System.DateTime object today.
/// </summary>
/// <param name="birthDate">The date of birth</param>
/// <returns>Age in years today. 0 is returned for a future date of birth.</returns>
public static int Age(this DateTime birthDate)
{
return Age(birthDate, DateTime.Today);
}
/// <summary>
/// Calculates the age in years of the current System.DateTime object on a later date.
/// </summary>
/// <param name="birthDate">The date of birth</param>
/// <param name="laterDate">The date on which to calculate the age.</param>
/// <returns>Age in years on a later day. 0 is returned as minimum.</returns>
public static int Age(this DateTime birthDate, DateTime laterDate)
{
int age;
age = laterDate.Year - birthDate.Year;
if (age > 0)
{
age -= Convert.ToInt32(laterDate.Date < birthDate.Date.AddYears(age));
}
else
{
age = 0;
}
return age;
}
}
Maintenant, exécutez ce test :
class Program
{
static void Main(string[] args)
{
RunTest();
}
private static void RunTest()
{
DateTime birthDate = new DateTime(2000, 2, 28);
DateTime laterDate = new DateTime(2011, 2, 27);
string iso = "yyyy-MM-dd";
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
Console.WriteLine("Birth date: " + birthDate.AddDays(i).ToString(iso) + " Later date: " + laterDate.AddDays(j).ToString(iso) + " Age: " + birthDate.AddDays(i).Age(laterDate.AddDays(j)).ToString());
}
}
Console.ReadKey();
}
}
L'exemple de la date critique est le suivant :
Date de naissance : 2000-02-29 Date ultérieure : 2011-02-28 Âge : 11 ans
Sortie :
{
Birth date: 2000-02-28 Later date: 2011-02-27 Age: 10
Birth date: 2000-02-28 Later date: 2011-02-28 Age: 11
Birth date: 2000-02-28 Later date: 2011-03-01 Age: 11
Birth date: 2000-02-29 Later date: 2011-02-27 Age: 10
Birth date: 2000-02-29 Later date: 2011-02-28 Age: 11
Birth date: 2000-02-29 Later date: 2011-03-01 Age: 11
Birth date: 2000-03-01 Later date: 2011-02-27 Age: 10
Birth date: 2000-03-01 Later date: 2011-02-28 Age: 10
Birth date: 2000-03-01 Later date: 2011-03-01 Age: 11
}
Et pour la date ultérieure 2012-02-28 :
{
Birth date: 2000-02-28 Later date: 2012-02-28 Age: 12
Birth date: 2000-02-28 Later date: 2012-02-29 Age: 12
Birth date: 2000-02-28 Later date: 2012-03-01 Age: 12
Birth date: 2000-02-29 Later date: 2012-02-28 Age: 11
Birth date: 2000-02-29 Later date: 2012-02-29 Age: 12
Birth date: 2000-02-29 Later date: 2012-03-01 Age: 12
Birth date: 2000-03-01 Later date: 2012-02-28 Age: 11
Birth date: 2000-03-01 Later date: 2012-02-29 Age: 11
Birth date: 2000-03-01 Later date: 2012-03-01 Age: 12
}
163 votes
Ce que toutes les réponses données jusqu'à présent ont omis, c'est que cela dépend de l'endroit où la personne est née et de l'endroit où elle se trouve actuellement.
49 votes
@Yaur : Il suffit de convertir l'heure actuelle + la naissance en GMT/UTC, l'âge est seulement une valeur relative, donc les fuseaux horaires ne sont pas pertinents. Pour déterminer le fuseau horaire actuel de l'utilisateur, vous pouvez utiliser GeoLocating.
1 votes
Pourquoi ne pas envisager la [date julienne][1] ? [1] : stackoverflow.com/questions/7103064/
9 votes
Si nous prenons en considération la suggestion de @Yaur concernant le calcul des fuseaux horaires, l'heure d'été devrait-elle affecter le calcul de quelque manière que ce soit ?
4 votes
Notez que pour une personne âgée de moins d'un an, son âge est indiqué en jours, semaines ou mois. Le temps de transition pour les unités peut être spécifique au domaine.
4 votes
Comme nous pouvons tous le constater, il n'existe pas de définition définitive de l'âge. Beaucoup de femmes que j'ai rencontrées ont tendance à arrondir leur temps de vie à une année complète jusqu'à la vingtaine, puis elles commencent à arrondir à la baisse. Je suis née le 3 janvier, donc je soustrais simplement l'année en cours de mon année de naissance, quel que soit le jour. Certaines personnes pensent que si vous êtes né un jour bissextile, vous vieillissez dans un rapport de 1/4. Qu'en est-il si vous êtes né à une seconde bissextile ? Un bébé de 8 mois compte-t-il pour 1 ? Si je vole vers l'ouest, est-ce que je rajeunis ? Si mon cœur s'arrête pendant une minute, dois-je l'inclure dans le calcul ?
2 votes
Un scénario que toutes les réponses ne prennent pas en compte : mon arrière grand-père est né le 29 février 1928. Il est mort l'année précédente, 13 mois avant son 23e anniversaire.
0 votes
@Rab -- en général, l'âge d'une personne née lors d'une année bissextile n'est pas calculé de cette façon .... mais la grammaire ci-dessus a été difficile à comprendre.
0 votes
C'est incroyable à quel point ce qui devrait être une opération simple est difficile ! Et les âges entiers ne correspondent pas toujours à ce que l'on attendrait non plus...