Pregunta ¿Cómo calculo la edad de alguien en C #?


Dado un DateTime representando el cumpleaños de una persona, ¿cómo puedo calcular su edad en años?


1744


origen


Respuestas:


Una solución fácil de entender y simple.

// Save today's date.
var today = DateTime.Today;
// Calculate the age.
var age = today.Year - birthdate.Year;
// Go back to the year the person was born in case of a leap year
if (birthdate > today.AddYears(-age)) age--;

Sin embargo, esto supone que está buscando el occidental idea de edad y no usar Cálculo del este asiático.


1714



Esta es una forma extraña de hacerlo, pero si formatea la fecha para yyyymmdd y reste la fecha de nacimiento de la fecha actual y luego suelte los últimos 4 dígitos que tiene la edad :)

No sé C #, pero creo que esto funcionará en cualquier idioma.

20080814 - 19800703 = 280111 

Suelta los últimos 4 dígitos = 28.

C # Code:

int now = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
int dob = int.Parse(dateOfBirth.ToString("yyyyMMdd"));
int age = (now - dob) / 10000;

O alternativamente sin toda la conversión de tipo en la forma de un método de extensión. Error al verificar omitido:

public static Int32 GetAge(this DateTime dateOfBirth)
{
    var today = DateTime.Today;

    var a = (today.Year * 100 + today.Month) * 100 + today.Day;
    var b = (dateOfBirth.Year * 100 + dateOfBirth.Month) * 100 + dateOfBirth.Day;

    return (a - b) / 10000;
}

892



No sé cómo se puede aceptar la solución incorrecta. El fragmento de C # correcto fue escrito por Michael Stum

Aquí hay un fragmento de prueba:

DateTime bDay = new DateTime(2000, 2, 29);
DateTime now = new DateTime(2009, 2, 28);
MessageBox.Show(string.Format("Test {0} {1} {2}",
                CalculateAgeWrong1(bDay, now),     // outputs 9
                CalculateAgeWrong2(bDay, now),     // outputs 9
                CalculateAgeCorrect(bDay, now)));  // outputs 8

Aquí tienes los métodos:

public int CalculateAgeWrong1(DateTime birthDate, DateTime now)
{
    return new DateTime(now.Subtract(birthDate).Ticks).Year - 1;
}

public int CalculateAgeWrong2(DateTime birthDate, DateTime now)
{
    int age = now.Year - birthDate.Year;

    if (now < birthDate.AddYears(age))
        age--;

    return age;
}

public int CalculateAgeCorrect(DateTime birthDate, DateTime now)
{
    int age = now.Year - birthDate.Year;

    if (now.Month < birthDate.Month || (now.Month == birthDate.Month && now.Day < birthDate.Day))
        age--;

    return age;
}

344



No creo que ninguna de las respuestas proporcione culturas que calculen la edad de manera diferente. Ver, por ejemplo, Reconocimiento de la edad del este asiático contra eso en el Oeste.

Alguna real la respuesta debe incluir la localización. los Patrón de estrategia probablemente estaría en orden en este ejemplo.


115



La respuesta simple a esto es aplicar AddYears como se muestra a continuación porque este es el único método nativo para agregar años hasta el 29 de febrero de años bisiestos y obtener el resultado correcto del 28 de febrero para los años comunes.

Algunos creen que el 1 de marzo es el cumpleaños de los saltos, pero ni .Net ni ninguna regla oficial respaldan esto, y la lógica común tampoco explica por qué algunos nacidos en febrero deben tener el 75% de sus cumpleaños en otro mes.

Además, un método Age se presta a agregarse como una extensión a DateTime. Con esto puedes obtener la edad de la manera más simple posible:

  1. Artículo de lista

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

Ahora, ejecuta esta prueba:

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

El ejemplo de fecha crítica es este:

Fecha de nacimiento: 2000-02-29 Fecha posterior: 2011-02-28 Edad: 11

Salida:

{
    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
}

Y para la fecha posterior 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
}

99



Mi sugerencia

int age = (int) ((DateTime.Now - bday).TotalDays/365.242199);

Parece que el año está cambiando en la fecha correcta. (Hice la prueba hasta la edad de 107)


76



Otra función, no por mí, pero que se encuentra en la web y la refinó un poco:

public static int GetAge(DateTime birthDate)
{
    DateTime n = DateTime.Now; // To avoid a race condition around midnight
    int age = n.Year - birthDate.Year;

    if (n.Month < birthDate.Month || (n.Month == birthDate.Month && n.Day < birthDate.Day))
        age--;

    return age;
}

Solo me vienen a la mente dos cosas: ¿qué hay de las personas de países que no usan el calendario gregoriano? DateTime.Now está en la cultura específica del servidor, creo. Tengo absolutamente 0 conocimiento sobre el hecho de trabajar con calendarios asiáticos y no sé si hay una manera fácil de convertir fechas entre calendarios, pero por si acaso te estás preguntando sobre esos chicos chinos del año 4660 :-)


65



Llego tarde a la fiesta, pero aquí hay una sola frase:

int age = new DateTime(DateTime.Now.Subtract(birthday).Ticks).Year-1;

44



2 Los principales problemas a resolver son:

1. Calcule la edad exacta - en años, meses, días, etc.

2. Calcule Edad generalmente percibida - a las personas generalmente no les importa cuántos años tienen exactamente, solo les importa cuándo es su cumpleaños en el año actual.


Solución para 1 es obvio:

DateTime birth = DateTime.Parse("1.1.2000");
DateTime today = DateTime.Today;     //we usually don't care about birth time
TimeSpan age = today - birth;        //.NET FCL should guarantee this as precise
double ageInDays = age.TotalDays;    //total number of days ... also precise
double daysInYear = 365.2425;        //statistical value for 400 years
double ageInYears = ageInDays / daysInYear;  //can be shifted ... not so precise

Solución para 2 es el que no es tan preciso para determinar la edad total, pero las personas lo perciben con precisión. Las personas también suelen usarlo cuando calculan su edad "manualmente":

DateTime birth = DateTime.Parse("1.1.2000");
DateTime today = DateTime.Today;
int age = today.Year - birth.Year;    //people perceive their age in years

if (today.Month < birth.Month ||
   ((today.Month == birth.Month) && (today.Day < birth.Day)))
{
  age--;  //birthday in current year not yet reached, we are 1 year younger ;)
          //+ no birthday for 29.2. guys ... sorry, just wrong date for birth
}

Notas a 2 .:

  • Esta es mi solución preferida
  • No podemos usar DateTime.DayOfYear o TimeSpans, ya que cambian el número de días en los años bisiestos
  • He puesto allí pocas líneas más para la legibilidad

Solo una nota más ... Crearía 2 métodos estáticos sobrecargados, uno para uso universal, segundo para uso amigable:

public static int GetAge(DateTime bithDay, DateTime today) 
{ 
  //chosen solution method body
}

public static int GetAge(DateTime birthDay) 
{ 
  return GetAge(birthDay, DateTime.Now);
}

44



Hace muchos años, para proporcionar un truco de calculadora de edad en mi sitio web, escribí una función para calcular la edad en una fracción. Este es un puerto rápido de esa función para C # (desde la versión de PHP) Me temo que no he podido probar la versión de C #, ¡pero espero que disfrutes de todos modos!

(Es cierto que esto es un poco artificioso a los efectos de mostrar los perfiles de usuario en Stack Overflow, pero tal vez los lectores encuentren algún uso para él. :-))

double AgeDiff(DateTime date1, DateTime date2) {
    double years = date2.Year - date1.Year;

    /*
     * If date2 and date1 + round(date2 - date1) are on different sides
     * of 29 February, then our partial year is considered to have 366
     * days total, otherwise it's 365. Note that 59 is the day number
     * of 29 Feb.
     */
    double fraction = 365
            + (DateTime.IsLeapYear(date2.Year) && date2.DayOfYear >= 59
            && (date1.DayOfYear < 59 || date1.DayOfYear > date2.DayOfYear)
            ? 1 : 0);

    /*
     * The only really nontrivial case is if date1 is in a leap year,
     * and date2 is not. So let's handle the others first.
     */
    if (DateTime.IsLeapYear(date2.Year) == DateTime.IsLeapYear(date1.Year))
        return years + (date2.DayOfYear - date1.DayOfYear) / fraction;

    /*
     * If date2 is in a leap year, but date1 is not and is March or
     * beyond, shift up by a day.
     */
    if (DateTime.IsLeapYear(date2.Year)) {
        return years + (date2.DayOfYear - date1.DayOfYear
                - (date1.DayOfYear >= 59 ? 1 : 0)) / fraction;
    }

    /*
     * If date1 is not on 29 February, shift down date1 by a day if
     * March or later. Proceed normally.
     */
    if (date1.DayOfYear != 59) {
        return years + (date2.DayOfYear - date1.DayOfYear
                + (date1.DayOfYear > 59 ? 1 : 0)) / fraction;
    }

    /*
     * Okay, here date1 is on 29 February, and date2 is not on a leap
     * year. What to do now? On 28 Feb in date2's year, the ``age''
     * should be just shy of a whole number, and on 1 Mar should be
     * just over. Perhaps the easiest way is to a point halfway
     * between those two: 58.5.
     */
    return years + (date2.DayOfYear - 58.5) / fraction;
}

33