2010-02-03 14 views
15

Mögliche Duplizieren:
How do I calculate someone’s age in C#?Wie berechnet man ein Alter basierend auf einem Geburtstag?

Ich möchte eine ASP.NET-Hilfsmethode schreiben, die das Alter einer Person seinen oder ihren Geburtstag gegeben zurück.

Ich habe versucht, Code wie folgt:

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

Aber es funktioniert nicht. Was ist der richtige Weg, um das Alter der Person basierend auf ihrem Geburtstag zu berechnen?

Antwort

38

Stackoverflow verwendet eine solche Funktion, um das Alter eines Benutzers zu bestimmen.

Calculate age in C#

Die gegebene Antwort ist

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

So Ihre Hilfsmethode wie

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

heute aussehen würde, verwende ich eine andere Version dieser Funktion ein Datum der Hinweis enthalten . Dies erlaubt mir, das Alter von jemandem zu einem späteren Zeitpunkt oder in der Vergangenheit zu bekommen. Dies wird für unser Reservierungssystem verwendet, wo das Alter in der Zukunft benötigt wird.

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

    return age; 
} 
+0

Warum nicht einfach nur 'new DateTime (DateTime.Now.Subtract (birthDate.Ticks) .Year - 1'? –

+0

Nebenbei, was ist das richtige Verhalten für Geburtsdaten in der Zukunft? Gebe eine negative Zahl zurück? Werfen? Auch tun Menschen, die buchstäblich gestern geboren wurden, haben ein Alter von 0 Jahren? –

+0

@Steven Jemand, der noch nicht geboren ist sollte immer ein Alter von 0 haben, imo. Sie haben nur 1 Jahr am Ende des Jahres. Das ist die gleiche Debatte, die aufgetreten ist Wir haben die Änderung gefeiert, aber das 2000. Jahr war erst Anfang 2001 abgeschlossen, also hätten wir Anfang 2000 nicht Anfang 2000 das 2000. Jahr feiern sollen. –

-2

Ich verstehe nicht wirklich, warum Sie dies zu einem HTML-Helfer machen würden. Ich würde es Teil des ViewData-Wörterbuchs in einer Aktionsmethode des Controllers machen. So etwas wie das:

Gegeben, dass Geburtstag in eine Aktionsmethode übergeben wird und ein DateTime-Objekt ist.

+2

doesn arbeite nicht, wenn jemand geboren wurde " '2009-12-31''; in ''2010-01-01'' schon ein Jahr? –

+0

Wie gesagt, es ist immer richtig, wenn die Person am ersten Januar geboren wird. In jedem anderen Fall gibt es Daten, bei denen das Ergebnis falsch ist, wenn der aktuelle Monat/Tag nicht hinter dem Monat/Tag des Geburtsdatums liegt. –

1

Ich mache es wie folgt aus:

(Verkürzte der Code ein Bit)

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

Eine weitere clevere Art und Weise von diesem ancient thread:

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