2238 Stimmen

Wie berechne ich das Alter einer Person auf der Grundlage eines Geburtstags vom Typ DateTime?

Angesichts einer DateTime Wie kann ich das Alter einer Person in Jahren berechnen?

190 Stimmen

Was bei allen Antworten bisher übersehen wurde, ist, dass es davon abhängt, wo die Person geboren wurde und wo sie sich gerade befindet.

54 Stimmen

@Yaur: Rechnen Sie einfach die Zeit von jetzt + Geburt in GMT/UTC um, Alter ist nur ein relativer Wert, daher sind Zeitzonen irrelevant. Um die aktuelle Zeitzone des Benutzers zu ermitteln, können Sie GeoLocating verwenden.

1 Stimmen

Warum nicht das [Julianische Datum][1] in Betracht ziehen? [1]: stackoverflow.com/questions/7103064/

2411voto

Mike Polen Punkte 3526

Eine leicht zu verstehende 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 in which the person was born in case of a leap year
if (birthdate.Date > today.AddYears(-age)) age--;

Dies setzt jedoch voraus, dass Sie nach dem westlich Idee des Alters und nicht mit Ostasiatische Abrechnung .

1115voto

ScArcher2 Punkte 81775

Das ist eine seltsame Vorgehensweise, aber wenn Sie das Datum so formatieren, dass es yyyymmdd und subtrahieren Sie das Geburtsdatum vom aktuellen Datum, dann lassen Sie die letzten 4 Ziffern weg, und Sie haben das Alter :)

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

20080814 - 19800703 = 280111 

Die letzten 4 Ziffern weglassen = 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 Typkonvertierung in Form einer Erweiterungsmethode. Die Fehlerprüfung entfällt:

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

423voto

RMA Punkte 231

Hier ist ein Testfragment:

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
                CalculateAgeCorrect2(bDay, now)));  // outputs 8

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

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

    // For leap years we need this
    if (birthDate > now.AddYears(-age)) 
        age--;
    // Don't use:
    // if (birthDate.AddYears(age) > now) 
    //     age--;

    return age;
}

126voto

camelCasus Punkte 61

Die einfache Antwort auf diese Frage ist die Anwendung AddYears wie unten gezeigt, weil dies die einzige native Methode ist, um Jahre zum 29. Februar von Schaltjahren zu addieren und das korrekte Ergebnis des 28. Februar für gewöhnliche Jahre zu erhalten.

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

Darüber hinaus bietet sich eine Age-Methode an, die als Erweiterung zu DateTime . Auf diese Weise können Sie das Alter auf einfachste Weise ermitteln:

  1. Posten auflisten

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

Führen Sie nun diesen Test durch:

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

Ein Beispiel für ein kritisches Datum ist dieses:

Geburtsdatum: 2000-02-29 Späteres Datum: 2011-02-28 Alter: 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
}

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
}

98voto

James Curran Punkte 98228

Mein Vorschlag

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

Damit scheint der Jahreswechsel auf das richtige Datum zu fallen. (Ich habe bis zum Alter von 107 Jahren Stichproben gemacht.)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X