Frage Wie berechne ich das Alter von jemandem in C #?


Angenommen DateTime den Geburtstag einer Person darstellend, wie berechne ich ihr Alter in Jahren?


1744


Ursprung


Antworten:


Eine leicht verständliche und einfache Lösung.

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

Dies setzt jedoch voraus, dass Sie nach dem suchen Western Idee des Alters und nicht verwenden Ostasiatische Abrechnung.


1714



Dies ist eine seltsame Art, es zu tun, aber wenn Sie das Datum formatieren yyyymmdd und subtrahiere das Geburtsdatum vom aktuellen Datum und lasse dann die letzten 4 Ziffern des Alters fallen :)

Ich kenne C # nicht, aber ich glaube, das wird in jeder Sprache funktionieren.

20080814 - 19800703 = 280111 

Lösche die letzten 4 Ziffern = 28.

C # -Code:

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

Oder alternativ ohne die Typumwandlung in Form einer Erweiterungsmethode. Fehlerprüfung weggelassen:

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



Ich weiß nicht, wie die falsche Lösung akzeptiert werden kann. Das korrekte C # -Snippet wurde von Michael Stum geschrieben

Hier ist ein Testausschnitt:

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

Hier haben Sie die Methoden:

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



Ich glaube nicht, dass eine der bisherigen Antworten Kulturen enthält, die das Alter anders berechnen. Siehe zum Beispiel Ostasiatische Alter Reckoning im Gegensatz zu dem im Westen.

Irgendein echt Antwort muss Lokalisierung enthalten. Das Strategie-Muster wäre in diesem Beispiel wahrscheinlich in Ordnung.


115



Die einfache Antwort darauf ist anzuwenden AddYears wie unten gezeigt, da dies die einzige native Methode ist, Jahre zum 29. Februar von Schaltjahren hinzuzufügen und das korrekte Ergebnis vom 28. Februar für gewöhnliche Jahre zu erhalten.

Einige glauben, dass der 1. März der Geburtstag von Springern ist, aber weder .Net noch irgendeine offizielle Regel unterstützen dies, noch erklärt die allgemeine Logik, warum manche, die im Februar geboren wurden, 75% ihrer Geburtstage in einem anderen Monat haben sollten.

Außerdem bietet sich eine Age-Methode an, die als Erweiterung hinzugefügt werden soll DateTime. Dadurch können Sie das Alter auf die einfachste Weise erhalten:

  1. Listenpunkt

int age = Geburtsdatum.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;
    }
}

Führen Sie jetzt diesen Test aus:

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

Das Beispiel für ein kritisches Datum ist dies:

Geburtsdatum: 2000-02-29 Späteres Datum: 2011-02-28 Alter: 11

Ausgabe:

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

Und für das spätere Datum 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



Mein Vorschlag

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

Damit scheint sich das Jahr zum richtigen Zeitpunkt zu ändern. (Ich werde bis zum Alter von 107 Jahren getestet)


76



Eine andere Funktion, nicht von mir, sondern im Internet gefunden und verfeinert ein bisschen:

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

Nur zwei Dinge, die mir in den Sinn kommen: Was ist mit Leuten aus Ländern, die den Gregorianischen Kalender nicht benutzen? DateTime.Now ist in der Server-spezifischen Kultur, denke ich. Ich habe absolut kein Wissen über die Arbeit mit asiatischen Kalendern und ich weiß nicht, ob es eine einfache Möglichkeit gibt, Daten zwischen Kalendern zu konvertieren, aber nur für den Fall, dass Sie sich über die Chinesen aus dem Jahr 4660 wundern :-)


65



Ich bin zu spät zur Party, aber hier ist ein One-Liner:

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

44



2 Hauptprobleme zu lösen sind:

1. Berechnen Sie das genaue Alter - in Jahren, Monaten, Tagen usw.

2. Berechne allgemein wahrgenommenes Alter - den Menschen ist es normalerweise egal, wie alt sie genau sind, sie kümmern sich nur, wenn ihr Geburtstag im laufenden Jahr ist.


Lösung für 1 Es ist offensichtlich:

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

Lösung für 2 ist derjenige, der das Gesamtalter nicht so genau bestimmt, sondern von den Menschen als präzise wahrgenommen wird. Die Leute benutzen es normalerweise auch, wenn sie ihr Alter "manuell" berechnen:

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
}

Hinweise zu 2 .:

  • Dies ist meine bevorzugte Lösung
  • Wir können DateTime.DayOfYear oder TimeSpans nicht verwenden, da sie die Anzahl der Tage in Schaltjahren verschieben
  • Ich habe dort etwas mehr Zeilen zur besseren Lesbarkeit eingefügt

Nur noch eine Anmerkung ... Ich würde 2 statische überladene Methoden dafür erstellen, eine für die universelle Nutzung, die zweite für die Benutzerfreundlichkeit:

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

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

44