Domanda Come faccio a calcolare l'età di qualcuno in C #?


Dato a DateTime rappresenta il compleanno di una persona, come faccio a calcolare la loro età in anni?


1744


origine


risposte:


Una soluzione facile da capire e semplice.

// Save today's date.
var today = DateTime.Today;
// Calculate the age.
var age = today.Year - birthdate.Year;
// Go back to the year the person was born in case of a leap year
if (birthdate > today.AddYears(-age)) age--;

Tuttavia, questo presuppone che tu stia cercando il occidentale idea dell'età e non l'uso Calcolo dell'Asia orientale.


1713



Questo è uno strano modo per farlo, ma se si formatta la data su yyyymmdd e sottrarre la data di nascita dalla data corrente quindi eliminare le ultime 4 cifre che hai l'età :)

Non conosco C #, ma credo che funzionerà in qualsiasi lingua.

20080814 - 19800703 = 280111 

Rilascia le ultime 4 cifre = 28.

Codice C #:

int now = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
int dob = int.Parse(dateOfBirth.ToString("yyyyMMdd"));
int age = (now - dob) / 10000;

O in alternativa senza tutta la conversione di tipo sotto forma di un metodo di estensione. Controllo errori omesso:

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

892



Non so come possa essere accettata la soluzione sbagliata. Lo snippet C # corretto è stato scritto da Michael Stum

Ecco uno snippet di test:

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

Ecco i metodi:

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

344



Non credo che nessuna delle risposte finora fornisca culture che calcolano l'età in modo diverso. Vedi, per esempio, Reckoning dell'età dell'asia orientale contro quello in Occidente.

Qualunque vero la risposta deve includere la localizzazione. Il Modello di strategia sarebbe probabilmente in ordine in questo esempio.


115



La semplice risposta a questo è da applicare AddYears come mostrato di seguito perché questo è l'unico metodo nativo per aggiungere anni al 29 febbraio degli anni bisestili e ottenere il risultato corretto del 28 febbraio per gli anni comuni.

Alcuni ritengono che il 1 ° marzo sia il compleanno degli sposi, ma né. Net né alcuna regola ufficiale lo supporta, né la logica comune spiega perché alcuni nati a febbraio dovrebbero avere il 75% dei loro compleanni in un altro mese.

Inoltre, un metodo Age si presta ad essere aggiunto come estensione a DateTime. Con questo è possibile ottenere l'età nel modo più semplice possibile:

  1. Elemento dell'elenco

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

Ora esegui questo test:

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

L'esempio di data critica è questo:

Data di nascita: 2000-02-29 Data successiva: 2011-02-28 Età: 11

Produzione:

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

E per la data successiva 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
}

99



Il mio consiglio

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

Sembra che l'anno cambi nella data giusta. (Riconosco fino a 107 anni)


76



Un'altra funzione, non da me ma trovata sul web e perfezionata un po ':

public static int GetAge(DateTime birthDate)
{
    DateTime n = DateTime.Now; // To avoid a race condition around midnight
    int age = n.Year - birthDate.Year;

    if (n.Month < birthDate.Month || (n.Month == birthDate.Month && n.Day < birthDate.Day))
        age--;

    return age;
}

Solo due cose che mi vengono in mente: che dire delle persone di paesi che non usano il calendario gregoriano? DateTime.Now è nella cultura specifica del server, credo. Ho assolutamente 0 conoscenze circa il fatto di lavorare con calendari asiatici e non so se c'è un modo semplice per convertire le date tra calendari, ma nel caso ti stia chiedendo di quei ragazzi cinesi dell'anno 4660 :-)


65



Sono in ritardo per la festa, ma qui c'è una sola:

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

44