Wie berechne ich das Alter einer Person in C #?

  • Wie berechne ich angesichts eines DateTime, das den Geburtstag einer Person darstellt, ihr Alter in Jahren?

    21 April 2018
    29 revs, 25 users 37%Shaik Raffi
60 answers
  • 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 suchen für die westliche Vorstellung von Alter und die Verwendung von ostasiatische Abrechnung .

    05 July 2018
    24 revs, 14 users 20%Mike Polen
  • Dies ist ein merkwürdiger Weg, aber wenn Sie das Datum in yyyymmdd formatieren und das Geburtsdatum vom aktuellen Datum subtrahieren, dann lassen Sie die letzten 4 Ziffern des Alters fallen:)

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

     20080814 - 19800703 = 280111 
     

    Die letzten 4 Ziffern löschen = 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 gesamte Typumwandlung in Form einer Erweiterungsmethode. Fehlerprüfung ausgelassen:

     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;
    }
     
    01 January 2017
    12 revs, 8 users 38%ScArcher2
  • Ich weiß nicht, wie die falsche Lösung akzeptiert werden kann. Das richtige C # -Schnipsel wurde von Michael Stum geschrieben.

    Hier ist ein Testschnipsel:

     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;
    }
     
    07 February 2016
    4 revs, 4 users 78%RMA
  • Ich glaube nicht, dass die Antworten bisher für Kulturen geeignet sind, die das Alter anders berechnen. Siehe zum Beispiel Ostasiatische Abrechnung gegenüber dem im Westen.

    Jede Antwort real muss die Lokalisierung enthalten. Das Strategiemuster wäre in diesem Beispiel wahrscheinlich in Ordnung.

    05 July 2018
    2 revs, 2 users 86%James A. Rosen
  • Die einfache Antwort darauf ist, wie unten gezeigt AddYears anzuwenden, da dies die einzige native Methode ist, die dem 29. Februar der Schaltjahre Jahre hinzufügt und das korrekte Ergebnis vom 28. Februar 2008 erzielt. für gewöhnliche Jahre.

    Einige glauben, dass der 1. März der Geburtstag von Sprüngen ist, aber weder .Net noch irgendeine offizielle Regel unterstützen dies, noch erklärt eine gewöhnliche Logik, warum im Februar Geborene 75% haben sollten. ihrer Geburtstage in einem anderen Monat.

    Außerdem kann eine Age-Methode als Erweiterung zu DateTime hinzugefügt werden. Auf diese Weise können Sie das Alter auf einfachste Weise ermitteln:

    1. Listenelement

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

    Jetzt Führen Sie 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 kritische Datumsbeispiel lautet wie folgt:

    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
    }
     
    07 February 2016
    6 revs, 6 users 86%camelCasus
  • Mein Vorschlag

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

    Das Jahr scheint sich zum richtigen Datum zu ändern. (Ich habe bis zu einem Alter von 107 Jahren vor Ort getestet)

    01 August 2013
    JonH
  • Eine weitere Funktion, die nicht von mir stammt, sondern im Web gefunden und etwas verfeinert wurde:

     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;
    }
     
    < Zwei Dinge, die mir in den Sinn kommen: Was ist mit Leuten aus Ländern, die den gregorianischen Kalender nicht verwenden? DateTime.Now ist in der serverspezifischen 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, Datumsangaben zwischen Kalendern zu konvertieren, aber nur für den Fall, dass Sie sich über diese Chinesen aus dem Jahr 4660 fragen: -) >
    25 July 2017
    5 revs, 3 users 93%Michael Stum
  • 2 Zu lösende Hauptprobleme sind:

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

    2. Berechnen Im Allgemeinen wahrgenommenes Alter - den Leuten ist es in der Regel egal, wie alt sie sind, sie kümmern sich nur um ihren Geburtstag im laufenden Jahr.


    Die Lösung für 1 liegt auf der Hand:

     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 diejenige, die das Gesamtalter nicht so genau bestimmt, aber von den Menschen als genau empfunden wird. Normalerweise verwenden die Leute es 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
    }
     

    Anmerkungen zu 2.:

    • Dies ist meine bevorzugte Lösung.
    • Wir können DateTime.DayOfYear oder TimeSpans nicht verwenden, da sich die Anzahl der Tage im Sprung ändert Jahre
    • Ich habe dort etwas mehr Zeilen für die Lesbarkeit eingefügt.

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

     public static int GetAge(DateTime bithDay, DateTime today) 
    { 
      //chosen solution method body
    }
    
    public static int GetAge(DateTime birthDay) 
    { 
      return GetAge(birthDay, DateTime.Now);
    }
     
    07 February 2016
    5 revs, 2 users 96%Thetam
  • Ich bin zu spät zur Party, aber hier ist ein Einzeiler:

     int age = new DateTime(DateTime.Now.Subtract(birthday).Ticks).Year-1;
     
    12 December 2009
    2 revs, 2 users 80%SillyMonkey
  • Vor vielen Jahren habe ich, um ein Altersrechner-Gimmick auf meiner Website bereitzustellen, eine Funktion, um das Alter zu einem Bruchteil zu berechnen. Dies ist eine schnelle Übertragung dieser Funktion auf C # (von der PHP-Version ). Ich fürchte, ich konnte die C # -Version nicht testen, aber ich hoffe, es gefällt Ihnen trotzdem!

    (Zugegebenermaßen ist dies ein bisschen Spielereien, um Benutzer zu zeigen Profile auf Stack Overflow, aber möglicherweise finden Leser etwas Verwendung.: -))

     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;
    }
     
    01 August 2008
    3 revsChris Jester-Young