Angesichts einer DateTime
Wie kann ich das Alter einer Person in Jahren berechnen?
Antworten
Zu viele Anzeigen?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 .
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;
}
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;
}
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:
- 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
}
- See previous answers
- Weitere Antworten anzeigen
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/
9 Stimmen
Wenn wir den Vorschlag von @Yaur für zeitzonenübergreifende Berechnungen in Betracht ziehen, sollte die Sommerzeit die Berechnung in irgendeiner Weise beeinflussen?
4 Stimmen
Beachten Sie, dass das Alter von Personen, die weniger als ein Jahr alt sind, in Tagen, Wochen oder Monaten angegeben wird. Die Übergangszeit für die Einheiten kann bereichsspezifisch sein.
6 Stimmen
Wie wir alle sehen können, gibt es keine endgültige Definition des Alters. Viele Frauen, die ich kennengelernt habe, neigen dazu, ihre Lebenszeit auf ein ganzes Jahr aufzurunden, bis sie etwa zwanzig sind, dann beginnen sie abzurunden. Ich bin am 3. Januar geboren, also ziehe ich einfach das laufende Jahr von meinem Geburtsjahr ab, egal welcher Tag es ist. Manche Leute denken, wenn man an einem Schalttag geboren ist, altert man im Verhältnis 1/4. Was ist, wenn man an einer Schaltsekunde geboren ist? Zählt ein 8 Monate altes Baby als 1? Wenn ich nach Westen fliege, werde ich dann jünger? Wenn mein Herz für eine Minute stehen bleibt, sollte ich das in die Berechnung einbeziehen?
3 Stimmen
Ein Szenario, das bei allen Antworten nicht berücksichtigt wird: Mein Urgroßvater wurde am 29. Februar 1928 geboren. Er starb im vorletzten Jahr, nur 13 Monate vor seinem 23. Geburtstag.
1 Stimmen
@Rab - im Allgemeinen wird das Alter von Personen, die in einem Schaltjahr geboren sind, nicht auf diese Weise berechnet .... aber die obige Grammatik hat eine Weile gedauert, um sie zu verstehen.
0 Stimmen
Es ist erstaunlich, wie schwierig das ist, was eigentlich eine einfache Operation sein sollte! Und die ganzzahligen Altersangaben entsprechen auch nicht immer dem, was man erwarten würde...
1 Stimmen
@Yaur, die Zeitzone ist für die Berechnung des Alters irrelevant, da die angegebenen Daten diese Information bereits enthalten sollten.