Berechnen Sie das Alter in C # [c#]


Answers

Das ist eine seltsame Art, das zu tun, aber wenn du das Datum auf yyyymmdd und das Geburtsdatum vom aktuellen Datum subtrahierst, dann yyyymmdd die letzten 4 Stellen das Alter :)

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

20080814 - 19800703 = 280111 

Lasse die letzten 4 Ziffern fallen = 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. Fehlerüberprü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;
}
Question

Wenn DateTime eine DateTime für den Geburtstag einer Person verwende, wie berechne ich ihr Alter in Jahren?




Ich glaube nicht, dass eine der Antworten bisher Kulturen vorsieht, die das Alter anders berechnen. Siehe zum Beispiel die ostasiatische Altersabrechnung im Vergleich zu der im Westen.

Jede echte Antwort muss Lokalisierung enthalten. Das Strategy Pattern wäre in diesem Beispiel wahrscheinlich in Ordnung.




Mein Vorschlag

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

Das scheint das Jahr zum richtigen Zeitpunkt zu ändern. (Ich habe bis zum Alter von 107 Jahren getestet)




Ich bin spät dran, aber hier ist ein Einzeiler:

int age = new DateTime(DateTime.Now.Subtract(birthday).Ticks).Year-1;



Dies ist die Version, die wir hier verwenden. Es funktioniert, und es ist ziemlich einfach. Es ist die gleiche Idee wie Jeffs, aber ich denke, es ist ein wenig klarer, weil es die Logik für das Subtrahieren einer ausscheidet, also ist es ein wenig einfacher zu verstehen.

public static int GetAge(this DateTime dateOfBirth, DateTime dateAsAt)
{
    return dateAsAt.Year - dateOfBirth.Year - (dateOfBirth.DayOfYear < dateAsAt.DayOfYear ? 0 : 1);
}

Sie könnten den ternären Operator erweitern, um es noch deutlicher zu machen, wenn Sie denken, dass so etwas unklar ist.

Offensichtlich wird dies als eine Erweiterungsmethode bei DateTime , aber Sie können diese Codezeile, die die Arbeit DateTime , eindeutig DateTime und überall platzieren. Hier haben wir eine weitere Überladung der Erweiterungsmethode, die in DateTime.Now , nur der Vollständigkeit DateTime.Now .




Ich benutze das:

public static class DateTimeExtensions
{
    public static int Age(this DateTime birthDate)
    {
        return Age(birthDate, DateTime.Now);
    }

    public static int Age(this DateTime birthDate, DateTime offsetDate)
    {
        int result=0;
        result = offsetDate.Year - birthDate.Year;

        if (offsetDate.DayOfYear < birthDate.DayOfYear)
        {
              result--;
        }

        return result;
    }
}



Dies gibt "mehr Details" zu dieser Frage. Vielleicht ist es das, wonach du suchst

DateTime birth = new DateTime(1974, 8, 29);
DateTime today = DateTime.Now;
TimeSpan span = today - birth;
DateTime age = DateTime.MinValue + span;

// Make adjustment due to MinValue equalling 1/1/1
int years = age.Year - 1;
int months = age.Month - 1;
int days = age.Day - 1;

// Print out not only how many years old they are but give months and days as well
Console.Write("{0} years, {1} months, {2} days", years, months, days);



Ich habe einige Zeit damit verbracht und daran gearbeitet, um das Alter von jemandem in Jahren, Monaten und Tagen zu berechnen. Ich habe gegen das 29. Februar Problem und Schaltjahre getestet und es scheint zu funktionieren, ich würde mich über Feedback freuen:

public void LoopAge(DateTime myDOB, DateTime FutureDate)
{
    int years = 0;
    int months = 0;
    int days = 0;

    DateTime tmpMyDOB = new DateTime(myDOB.Year, myDOB.Month, 1);

    DateTime tmpFutureDate = new DateTime(FutureDate.Year, FutureDate.Month, 1);

    while (tmpMyDOB.AddYears(years).AddMonths(months) < tmpFutureDate)
    {
        months++;

        if (months > 12)
        {
            years++;
            months = months - 12;
        }
    }

    if (FutureDate.Day >= myDOB.Day)
    {
        days = days + FutureDate.Day - myDOB.Day;
    }
    else
    {
        months--;

        if (months < 0)
        {
            years--;
            months = months + 12;
        }

        days +=
            DateTime.DaysInMonth(
                FutureDate.AddMonths(-1).Year, FutureDate.AddMonths(-1).Month
            ) + FutureDate.Day - myDOB.Day;

    }

    //add an extra day if the dob is a leap day
    if (DateTime.IsLeapYear(myDOB.Year) && myDOB.Month == 2 && myDOB.Day == 29)
    {
        //but only if the future date is less than 1st March
        if (FutureDate >= new DateTime(FutureDate.Year, 3, 1))
            days++;
    }

}



TimeSpan diff = DateTime.Now - birthdayDateTime;
string age = String.Format("{0:%y} years, {0:%M} months, {0:%d}, days old", diff);

Ich bin mir nicht sicher, wie genau du es möchtest, also habe ich einfach eine lesbare Zeichenfolge erstellt.




Der einfachste Weg, den ich je gefunden habe, ist dies. Es funktioniert korrekt für die Ländereinstellungen in den USA und Westeuropa. Kann nicht mit anderen Orten sprechen, besonders an Orten wie China. 4 zusätzliche Vergleiche, höchstens nach der ersten Berechnung des Alters.

public int AgeInYears(DateTime birthDate, DateTime referenceDate)
{
  Debug.Assert(referenceDate >= birthDate, 
               "birth date must be on or prior to the reference date");

  DateTime birth = birthDate.Date;
  DateTime reference = referenceDate.Date;
  int years = (reference.Year - birth.Year);

  //
  // an offset of -1 is applied if the birth date has 
  // not yet occurred in the current year.
  //
  if (reference.Month > birth.Month);
  else if (reference.Month < birth.Month) 
    --years;
  else // in birth month
  {
    if (reference.Day < birth.Day)
      --years;
  }

  return years ;
}

Ich habe mir die Antworten darauf angeschaut und festgestellt, dass niemand auf die rechtlichen / rechtlichen Auswirkungen von Schaltjahren hingewiesen hat. Zum Beispiel, pro Wikipedia , wenn Sie am 29. Februar in verschiedenen Jurisdiktionen geboren sind, sind Sie nicht-Schaltjahr Geburtstag variiert:

  • In Großbritannien und Hongkong: Es ist der ordentliche Tag des Jahres, und am nächsten Tag, dem 1. März, haben Sie Geburtstag.
  • In Neuseeland: Es ist der Vortag, der 28. Februar für die Fahrerlizenzierung und der 1. März für andere Zwecke.
  • Taiwan: Es ist der 28. Februar.

Und soweit ich das beurteilen kann, schweigt die Satzung in den USA und überlässt es dem Common Law und der Art und Weise, wie verschiedene Regulierungsbehörden die Dinge in ihren Vorschriften definieren.

Zu diesem Zweck eine Verbesserung:

public enum LeapDayRule
{
  OrdinalDay     = 1 ,
  LastDayOfMonth = 2 ,
}

static int ComputeAgeInYears(DateTime birth, DateTime reference, LeapYearBirthdayRule ruleInEffect)
{
  bool isLeapYearBirthday = CultureInfo.CurrentCulture.Calendar.IsLeapDay(birth.Year, birth.Month, birth.Day);
  DateTime cutoff;

  if (isLeapYearBirthday && !DateTime.IsLeapYear(reference.Year))
  {
    switch (ruleInEffect)
    {
      case LeapDayRule.OrdinalDay:
        cutoff = new DateTime(reference.Year, 1, 1)
                             .AddDays(birth.DayOfYear - 1);
        break;

      case LeapDayRule.LastDayOfMonth:
        cutoff = new DateTime(reference.Year, birth.Month, 1)
                             .AddMonths(1)
                             .AddDays(-1);
        break;

      default:
        throw new InvalidOperationException();
    }
  }
  else
  {
    cutoff = new DateTime(reference.Year, birth.Month, birth.Day);
  }

  int age = (reference.Year - birth.Year) + (reference >= cutoff ? 0 : -1);
  return age < 0 ? 0 : age;
}

Es sollte beachtet werden, dass dieser Code folgendes voraussetzt:

  • Eine westliche (europäische) Altersrechnung und
  • Ein Kalender wie der Gregorianische Kalender, der am Ende eines Monats einen einzigen Schalttag einfügt.



Hier ist noch eine andere Antwort:

public static int AgeInYears(DateTime birthday, DateTime today)
{
    return ((today.Year - birthday.Year) * 372 + (today.Month - birthday.Month) * 31 + (today.Day - birthday.Day)) / 372;
}

Dies wurde ausgiebig einheits getestet. Es tut ein bisschen „Magie“ aussehen. Die Zahl 372 ist die Anzahl der Tage dort in einem Jahr sein würde, wenn jeder Monat 31 Tage hat.

Die Erklärung , warum es funktioniert ( von hier gehoben ) ist:

Lassen Sie uns gesetzt Yn = DateTime.Now.Year, Yb = birthday.Year, Mn = DateTime.Now.Month, Mb = birthday.Month, Dn = DateTime.Now.Day, Db = birthday.Day

age = Yn - Yb + (31*(Mn - Mb) + (Dn - Db)) / 372

Wir wissen , dass das, was wir brauchen , ist entweder , Yn-Ybwenn das Datum bereits erreicht ist, Yn-Yb-1wenn es nicht hat.

a) Wenn Mn<Mb, haben wir-341 <= 31*(Mn-Mb) <= -31 and -30 <= Dn-Db <= 30

-371 <= 31*(Mn - Mb) + (Dn - Db) <= -1

Mit ganzzahligen Teilungs

(31*(Mn - Mb) + (Dn - Db)) / 372 = -1

b) Wenn Mn=Mbund Dn<Dbwir haben31*(Mn - Mb) = 0 and -30 <= Dn-Db <= -1

Mit ganzzahligen Teilung wieder

(31*(Mn - Mb) + (Dn - Db)) / 372 = -1

c) Wenn Mn>Mb, haben wir31 <= 31*(Mn-Mb) <= 341 and -30 <= Dn-Db <= 30

1 <= 31*(Mn - Mb) + (Dn - Db) <= 371

Mit ganzzahligen Teilungs

(31*(Mn - Mb) + (Dn - Db)) / 372 = 0

d) Wenn Mn=Mbund Dn>Dbwir haben 31*(Mn - Mb) = 0 and 1 <= Dn-Db <= 30

Mit ganzzahligen Teilung wieder

(31*(Mn - Mb) + (Dn - Db)) / 372 = 0

e) Wenn Mn=Mbund Dn=Dbwir haben31*(Mn - Mb) + Dn-Db = 0

und deshalb (31*(Mn - Mb) + (Dn - Db)) / 372 = 0




Dies ist keine direkte Antwort, sondern eher eine philosophischen Argumentation über das Problem bei der Hand aus einer quasi-wissenschaftlicher Sicht.

Ich würde behaupten , dass die Frage nicht , das Gerät nicht angibt , noch Kultur , in der Zeit zu messen, scheinen die meisten Antworten eine ganze Zahl Jahres Darstellung zu übernehmen. Die SI-Einheit für die Zeit ist second, sollte die richtige generische Antwort ergo sein (natürlich normalisiert angenommen DateTimeund keine Rücksicht auch immer auf relativistische Effekte nehmen):

var lifeInSeconds = (DateTime.Now.Ticks - then.Ticks)/TickFactor;

In der christlichen Lebensalter in Jahren der Berechnung:

var then = ... // Then, in this case the birthday
var now = DateTime.UtcNow;
int age = now.Year - then.Year;
if (now.AddYears(-age) < then) age--;

In der Finanzwelt ist es ein ähnliches Problem , wenn etwas oft bezeichnet als die Berechnung Tagequotienten , was in etwa eine Reihe von Jahren für einen bestimmten Zeitraum ist. Und das Thema Alter ist wirklich ein Zeitmess Problem.

Beispiel für die actual / actual (Zählen aller Tage „richtig“) Konvention:

DateTime start, end = .... // Whatever, assume start is before end

double startYearContribution = 1 - (double) start.DayOfYear / (double) (DateTime.IsLeapYear(start.Year) ? 366 : 365);
double endYearContribution = (double)end.DayOfYear / (double)(DateTime.IsLeapYear(end.Year) ? 366 : 365);
double middleContribution = (double) (end.Year - start.Year - 1);

double DCF = startYearContribution + endYearContribution + middleContribution;

Ein weiterer durchaus üblich Weg, um Zeit zu messen, ist in der Regel durch „Serialisierung“ (der Typ, der dieses Datum Konvention benannt ernsthaft Trippin gewesen sein musste):

DateTime start, end = .... // Whatever, assume start is before end
int days = (end - start).Days;

Ich frage mich, wie lange müssen wir gehen, bevor ein relativistisches Alter in Sekunden nützlicher wird als die grobe Annäherung an dem Erde-around-sun-Zyklen während der Lebenszeit so weit :) Oder mit anderen Worten, wenn eine Periode muss einen Ort gegeben werden oder eine Funktion für sich, die Bewegung um gültig zu sein :)




Ich benutzte ScArcher2-Lösung für eine genaue Jahr Berechnung einer Alters Personen aber ich brauchte es weiter zu nehmen und ihre Monate zu berechnen und Tage zusammen mit den Jahren.

    public static Dictionary<string,int> CurrentAgeInYearsMonthsDays(DateTime? ndtBirthDate, DateTime? ndtReferralDate)
    {
        //----------------------------------------------------------------------
        // Can't determine age if we don't have a dates.
        //----------------------------------------------------------------------
        if (ndtBirthDate == null) return null;
        if (ndtReferralDate == null) return null;

        DateTime dtBirthDate = Convert.ToDateTime(ndtBirthDate);
        DateTime dtReferralDate = Convert.ToDateTime(ndtReferralDate);

        //----------------------------------------------------------------------
        // Create our Variables
        //----------------------------------------------------------------------
        Dictionary<string, int> dYMD = new Dictionary<string,int>();
        int iNowDate, iBirthDate, iYears, iMonths, iDays;
        string sDif = "";

        //----------------------------------------------------------------------
        // Store off current date/time and DOB into local variables
        //---------------------------------------------------------------------- 
        iNowDate = int.Parse(dtReferralDate.ToString("yyyyMMdd"));
        iBirthDate = int.Parse(dtBirthDate.ToString("yyyyMMdd"));

        //----------------------------------------------------------------------
        // Calculate Years
        //----------------------------------------------------------------------
        sDif = (iNowDate - iBirthDate).ToString();
        iYears = int.Parse(sDif.Substring(0, sDif.Length - 4));

        //----------------------------------------------------------------------
        // Store Years in Return Value
        //----------------------------------------------------------------------
        dYMD.Add("Years", iYears);

        //----------------------------------------------------------------------
        // Calculate Months
        //----------------------------------------------------------------------
        if (dtBirthDate.Month > dtReferralDate.Month)
            iMonths = 12 - dtBirthDate.Month + dtReferralDate.Month - 1;
        else
            iMonths = dtBirthDate.Month - dtReferralDate.Month;

        //----------------------------------------------------------------------
        // Store Months in Return Value
        //----------------------------------------------------------------------
        dYMD.Add("Months", iMonths);

        //----------------------------------------------------------------------
        // Calculate Remaining Days
        //----------------------------------------------------------------------
        if (dtBirthDate.Day > dtReferralDate.Day)
            //Logic: Figure out the days in month previous to the current month, or the admitted month.
            //       Subtract the birthday from the total days which will give us how many days the person has lived since their birthdate day the previous month.
            //       then take the referral date and simply add the number of days the person has lived this month.

            //If referral date is january, we need to go back to the following year's December to get the days in that month.
            if (dtReferralDate.Month == 1)
                iDays = DateTime.DaysInMonth(dtReferralDate.Year - 1, 12) - dtBirthDate.Day + dtReferralDate.Day;       
            else
                iDays = DateTime.DaysInMonth(dtReferralDate.Year, dtReferralDate.Month - 1) - dtBirthDate.Day + dtReferralDate.Day;       
        else
            iDays = dtReferralDate.Day - dtBirthDate.Day;             

        //----------------------------------------------------------------------
        // Store Days in Return Value
        //----------------------------------------------------------------------
        dYMD.Add("Days", iDays);

        return dYMD;
}



private int GetAge(int _year, int _month, int _day
{
    DateTime yourBirthDate= new DateTime(_year, _month, _day);

    DateTime todaysDateTime = DateTime.Today;
    int noOfYears = todaysDateTime.Year - yourBirthDate.Year;

    if (DateTime.Now.Month < yourBirthDate.Month ||
        (DateTime.Now.Month == yourBirthDate.Month && DateTime.Now.Day < yourBirthDate.Day))
    {
        noOfYears--;
    }

    return  noOfYears;
}



Das ist einfach und scheint für meine Bedürfnisse genau zu sein. Ich mache eine Annahme für die Zwecke der Schaltjahre, die unabhängig davon, wann die Person wählt den Geburtstag sind sie technisch nicht ein Jahr älter, bis ein vollen 365 Tage zu feiern hat, da es letzten Geburtstag vergangen (dh 28. Februar sie nicht macht ein Jahr älter)

DateTime now = DateTime.Today;
DateTime birthday = new DateTime(1991, 02, 03);//3rd feb

int age = now.Year - birthday.Year;

if (now.Month < birthday.Month || (now.Month == birthday.Month && now.Day < birthday.Day))//not had bday this year yet
  age--;

return age;

Lassen Sie uns wissen, wenn Sie irgendwelche Probleme erkennen;)