2010-02-03 10 views
15

Duplicar posible:
How do I calculate someone’s age in C#?¿Cómo se calcula una edad basada en un cumpleaños?

Quiero escribir un método de ayuda ASP.NET que devuelve la edad de una persona dada su cumpleaños.

He tratado de código como este:

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

Pero no está funcionando. ¿Cuál es la forma correcta de calcular la edad de la persona en función de su cumpleaños?

Respuesta

38

Stackoverflow utiliza dicha función para determinar la edad de un usuario.

Calculate age in C#

La respuesta dada es

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

Así que su método de ayuda se vería como

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(); 
} 

Hoy en día, utilizo una versión diferente de esta función para incluir una fecha de referencia . Esto me permite obtener la edad de alguien en el futuro o en el pasado. Esto se usa para nuestro sistema de reservas, donde se necesita la edad en el futuro.

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

    return age; 
} 
+0

¿Por qué no simplemente 'new DateTime (DateTime.Now.Subtract (birthDate.Ticks) .Year - 1'? –

+0

En una nota lateral, ¿cuál es el comportamiento correcto para las fechas de nacimiento en el futuro? ¿Devuelve un número negativo? ¿Lanzar? También, haga la gente literalmente nació ayer tiene una edad de 0 años? –

+0

@Steven Alguien que todavía no nació siempre debe tener una edad de 0, imo. Usted solo tiene 1 año al final de ese año. Ese es el mismo debate que ocurrió en y2k. Celebramos el cambio de fecha, pero el año 2000 se completó solo a comienzos de 2001, por lo que deberíamos haber celebrado el año 2000 a principios de 2001, no a principios de 2000. –

-2

Realmente no entiendo por qué harías de esto un HTML Helper. Lo haría parte del diccionario ViewData en un método de acción del controlador. Algo como esto:

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

Dado que el cumpleaños se pasa a un método de acción y es un objeto DateTime.

+2

doesn No funciona si alguien nació en ' '2009-12-31''; en '' 2010-01-01'' ya tiene un año? –

+0

Como dije, siempre es correcto si la persona nace el primero de enero. En cualquier otro caso, habrá fechas en las que el resultado sea incorrecto si el mes/día actual no es posterior al mes/día de la fecha de nacimiento. –

1

lo hago de esta manera:

(se ha reducido un poco su código)

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

Otra forma inteligente de ese ancient thread:

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