2010-02-03 4 views
15

Possible en double:
How do I calculate someone’s age in C#?Comment calculer un âge basé sur un anniversaire?

Je veux écrire une méthode d'aide ASP.NET qui renvoie l'âge d'une personne donnée son anniversaire.

J'ai essayé le code comme ceci:

public static string Age(this HtmlHelper helper, DateTime birthday) 
{ 
    return (DateTime.Now - birthday); //?? 
} 

Mais il ne fonctionne pas. Quelle est la bonne façon de calculer l'âge de la personne en fonction de son anniversaire?

Répondre

38

Stackoverflow utilise une telle fonction pour déterminer l'âge d'un utilisateur.

Calculate age in C#

La réponse donnée est

DateTime now = DateTime.Today; 
int age = now.Year - bday.Year; 
if (now < bday.AddYears(age)) age--; 

Ainsi, votre méthode d'assistance ressemblerait

public static string Age(this HtmlHelper helper, DateTime birthday) 
{ 
    DateTime now = DateTime.Today; 
    int age = now.Year - birthday.Year; 
    if (now < birthday.AddYears(age)) age--; 

    return age.ToString(); 
} 

Aujourd'hui, j'utilise une autre version de cette fonction d'inclure une date de référence . Cela me permet d'avoir l'âge de quelqu'un à une date ultérieure ou dans le passé. Ceci est utilisé pour notre système de réservation, où l'âge dans le futur est nécessaire.

public static int GetAge(DateTime reference, DateTime birthday) 
{ 
    int age = reference.Year - birthday.Year; 
    if (reference < birthday.AddYears(age)) age--; 

    return age; 
} 
+0

Pourquoi ne pas simplement 'new DateTime (DateTime.Now.Subtract (birthDate.Ticks) .Year - 1'? –

+0

Sur une note de côté, quel est le bon comportement pour les dates de naissance dans le futur? Renvoyer un nombre négatif? Throw? les personnes nées littéralement hier ont un âge de 0 ans –

+0

@Steven Quelqu'un qui n'est pas encore né devrait toujours avoir 0. Vous avez seulement 1 an à la fin de cette année. Nous avons fêté le changement de date, mais la deuxième année 2000 n'était terminée qu'au début de 2001, alors nous aurions dû célébrer la 2000e année au début de 2001 et non au début de 2000. –

-2

Je ne comprends pas vraiment pourquoi vous en feriez un HTML Helper. Je voudrais le faire partie du dictionnaire ViewData dans une méthode d'action du contrôleur. Quelque chose comme ceci:

ViewData["Age"] = DateTime.Now.Year - birthday.Year; 

Compte tenu de cet anniversaire est passé dans une méthode d'action et est un objet DateTime.

+2

doesn ne travaille pas si quelqu'un est né à ' «2009-12-31»; en 2010-01-01 a déjà un an? –

+0

Comme dit il est toujours correct si la personne est née le premier janvier. Dans tous les autres cas, il y aura des dates où le résultat est erroné si le mois/jour actuel n'est pas après le mois/jour de la date de naissance. –

1

Je fais comme ça:

(Raccourcissement un peu le code)

public struct Age 
{ 
    public readonly int Years; 
    public readonly int Months; 
    public readonly int Days; 

} 

public Age(int y, int m, int d) : this() 
{ 
    Years = y; 
    Months = m; 
    Days = d; 
} 

public static Age CalculateAge (DateTime birthDate, DateTime anotherDate) 
{ 
    if(startDate.Date > endDate.Date) 
     { 
      throw new ArgumentException ("startDate cannot be higher then endDate", "startDate"); 
     } 

     int years = endDate.Year - startDate.Year; 
     int months = 0; 
     int days = 0; 

     // Check if the last year, was a full year. 
     if(endDate < startDate.AddYears (years) && years != 0) 
     { 
      years--; 
     } 

     // Calculate the number of months. 
     startDate = startDate.AddYears (years); 

     if(startDate.Year == endDate.Year) 
     { 
      months = endDate.Month - startDate.Month; 
     } 
     else 
     { 
      months = (12 - startDate.Month) + endDate.Month; 
     } 

     // Check if last month was a complete month. 
     if(endDate < startDate.AddMonths (months) && months != 0) 
     { 
      months--; 
     } 

     // Calculate the number of days. 
     startDate = startDate.AddMonths (months); 

     days = (endDate - startDate).Days; 

     return new Age (years, months, days); 
} 

// Implement Equals, GetHashCode, etc... as well 
// Overload equality and other operators, etc... 

}

5

Une autre façon intelligente de cette ancient thread:

int age = (
    Int32.Parse(DateTime.Today.ToString("yyyyMMdd")) - 
    Int32.Parse(birthday.ToString("yyyyMMdd")))/10000; 
Questions connexes