|
|
|
Wie liegen denn die Daten vor? Tag, Monat, Jahr in einzelnen Variablen gespeichert, oder im DateTime Typ?
– Shelling 31.08.2009
|
||
|
Verdammt bist du schnell :) Wollte die Frage als Referenz festhalten, weil ich nichts brauchbares bei Google gefunden habe.
– Felix 31.08.2009
|
||
|
Falls du auch eine Lösung hast, nur her damit!
– Felix 31.08.2009
|
public static int GetAge(DateTime dateOfBirth, DateTime now)
{
var nowDate = now.Date;
if (dateOfBirth > nowDate) throw new ArgumentException();
if (dateOfBirth == nowDate) return 0;
var yearDiff = nowDate.Year - dateOfBirth.Year;
return dateOfBirth.DayOfYear <= nowDate.DayOfYear ? yearDiff : yearDiff - 1;
}
|
|
|
DayOfYear funktioniert nicht nach dem 28. Feb! Wenn eines der beiden Jahre ein Schaltjahr ist und das andere nicht, ergibt sich z.B. für den 1. März entweder 61 (Schaltjahr) oder 60 (kein Schaltjahr).
– BeachBlocker 10.09.2009
|
if (dateOfBirth > nowDate) throw new ArgumentException();
if (dateOfBirth == nowDate) return 0;
throw new ArgumentOutOfRangeException("dateOfBirth", dateOfBirth, "'dateOfBirth' is larger than 'now'");|
|
public int GetAgeAsInt(DateTime dateOfBirth)
{
return this.GetAgeAsInt(dateOfBirth, DateTime.Now);
}
public int GetAgeAsInt(DateTime dateOfBirth, DateTime referenceDate)
{
if (dateOfBirth > referenceDate)
throw new ArgumentOutOfRangeException("dateOfBirth", dateOfBirth, "'dateOfBirth' is larger than the given reference date");
return referenceDate.Year - dateOfBirth.Year;
}
|
|
TimeSpan diff = DateTime.Now - DateTime.Parse("1960-09-10");
double age = diff.TotalDays/365.25;|
|
|
hab das erst heute gelesen, aber dein eintrag ist der einzig vernünftige zu dem thema.
– nabuchodonossor 11.03.2011
|
||
| 1 |
Sehe ich anders. Die Lösung ignoriert, dass "Alter in Jahren" im alltäglichen Gebrauch eine Ganzzahl ist, die am jeweiligen Jahrestag hochgezählt wird. Dazu müsste man hier runden - aber nach welcher Regel? Am anschaulichsten wird das, wenn man Schaltjahre betrachtet: Die Differenz zwischen dem 1.3.1959 und dem 29.02.1960 sowie dem 1.3.1960 und dem 1.3.1961 ist exakt gleich, nämlich 365 Tage. Trotzdem wird man in dem einen Fall 0 Jahre als Alter angeben und in dem anderen 1. Dies kann das angegebene Verfahren nicht abbilden.
– Matthias Hlawatsch 11.03.2011
|
public static int YearSpan(DateTime fromDate, DateTime toDate)
{
if (fromDate.Date >= toDate.Date)
return 0;
string toDateStr = toDate.Date.ToString("yyyyMMdd");
string fromDateStr = fromDate.Date.ToString("yyyyMMdd");
return (int) (Convert.ToInt32(toDateStr) - Convert.ToInt32(fromDateStr)) / 10000;
}
|
|
DateTime date = DateTime.ParseExact("1977-08-31", "yyyy-MM-dd", null);
Console.Out.WriteLine("Age: {0}", date.Age());public class DateSpan
{
public DateSpan(DateTime fromDate, DateTime toDate)
{
if (fromDate < toDate) {
FromDate = fromDate;
ToDate = toDate;
Negative = false;
} else {
FromDate = toDate;
ToDate = fromDate;
Negative = true;
}
int remainingDaysInStartMonth = DateTime.DaysInMonth(FromDate.Year, FromDate.Month) - FromDate.Day + 1;
Days += ToDate.Day + remainingDaysInStartMonth;
int daysInMonth = DateTime.DaysInMonth(ToDate.Year, ToDate.Month);
if (Days > daysInMonth)
Days -= daysInMonth;
if (ToDate.Day < FromDate.Day)
{
--Months;
}
Months += ToDate.Month - FromDate.Month;
if (Months < 0)
{
Months += 12;
--Years;
}
Years += ToDate.Year - FromDate.Year;
if (Years < 0)
throw new Exception("Unexpected state");
}
public Boolean Negative { get; private set; }
public DateTime FromDate { get; private set; }
public DateTime ToDate { get; private set; }
public int Years { get; private set; }
public int Months { get; private set; }
public int Days { get; private set; }
public override string ToString()
{
return String.Format("{0} years, {1} months, {2} days", Years, Months, Days);
}
}
public static DateSpan Age(this DateTime anEvent)
{
return new DateSpan(anEvent, DateTime.Now);
}
Minutes += ToDate.Minute - FromDate.Minute;
if (Minutes < 0) {
Minutes += 60;
--Hours;
}
|
|