Vă mulțumim pentru susținere

Cum pot calcula vârsta cuiva în C #?

Având un DateTime care reprezintă ziua de naștere a unei persoane, cum îmi pot calcula vârsta în ani?

0
adăugat editat
@Yaur: Doar convertiți ora acum + naștere în GMT / UTC, vârsta este doar o valoare relativă, prin urmare, zonele de timp sunt irelevante. Pentru a stabili fusul orar curent al utilizatorului, puteți utiliza funcția GeoLocating.
adăugat autor Stefan Steiger
De ce să nu luați în considerare [data Julian] [1]? [1]: stackoverflow.com/questions/7103064/…
adăugat autor Muhammad Hewedy
ceea ce toate răspunsurile de până acum au ratat este că depinde de locul în care sa născut persoana și de unde se află acum.
adăugat autor Yaur
Rețineți că pentru o persoană mai mică de un an, vârsta lor este dată în zile, săptămâni sau luni. Timpul de tranziție pentru unități poate fi specific domeniului.
adăugat autor Andrew Morton
de ce nimeni nu folosește TimeSpan?
adăugat autor Arijit Mukherjee
Dacă luăm în considerare sugestia @Yaur despre calculele de timp încrucișat, ar trebui ca Day Day Saving Time să afecteze calculul în orice mod?
adăugat autor DDM
Nimeni nu a considerat ani buni? sau verificarea lunii?
adăugat autor Crash Override

7 răspunsuri

Cu mulți ani în urmă, pentru a furniza pe site-ul meu un gimmick calculator de vârstă , am scris o funcție pentru a calcula vârsta fracțiune. Acesta este un port rapid al acestei funcții la C # (de la Versiunea PHP ). Mă tem că nu am putut să testez versiunea C #, dar sper că te bucuri de toate!

(Desigur, acest lucru este un pic gimmic pentru a arata profilurile utilizatorilor pe Stack Overflow, dar cititorii le vor putea gasi ceva :-))

double AgeDiff(DateTime date1, DateTime date2) {
    double years = date2.Year - date1.Year;

    /*
     * If date2 and date1 + round(date2 - date1) are on different sides
     * of 29 February, then our partial year is considered to have 366
     * days total, otherwise it's 365. Note that 59 is the day number
     * of 29 Feb.
     */
    double fraction = 365
            + (DateTime.IsLeapYear(date2.Year) && date2.DayOfYear >= 59
            && (date1.DayOfYear < 59 || date1.DayOfYear > date2.DayOfYear)
            ? 1 : 0);

    /*
     * The only really nontrivial case is if date1 is in a leap year,
     * and date2 is not. So let's handle the others first.
     */
    if (DateTime.IsLeapYear(date2.Year) == DateTime.IsLeapYear(date1.Year))
        return years + (date2.DayOfYear - date1.DayOfYear) / fraction;

    /*
     * If date2 is in a leap year, but date1 is not and is March or
     * beyond, shift up by a day.
     */
    if (DateTime.IsLeapYear(date2.Year)) {
        return years + (date2.DayOfYear - date1.DayOfYear
                - (date1.DayOfYear >= 59 ? 1 : 0)) / fraction;
    }

    /*
     * If date1 is not on 29 February, shift down date1 by a day if
     * March or later. Proceed normally.
     */
    if (date1.DayOfYear != 59) {
        return years + (date2.DayOfYear - date1.DayOfYear
                + (date1.DayOfYear > 59 ? 1 : 0)) / fraction;
    }

    /*
     * Okay, here date1 is on 29 February, and date2 is not on a leap
     * year. What to do now? On 28 Feb in date2's year, the ``age''
     * should be just shy of a whole number, and on 1 Mar should be
     * just over. Perhaps the easiest way is to a point halfway
     * between those two: 58.5.
     */
    return years + (date2.DayOfYear - 58.5) / fraction;
}
0
adăugat
Asta e tare. Deși pur și simplu am folosit ani astronomice.
adăugat autor IllidanS4

Cea mai bună cale de care știu din cauza anilor buni și totul este:

DateTime birthDate = new DateTime(2000,3,1);
int age = (int)Math.Floor((DateTime.Now - birthDate).TotalDays / 365.25D);

Sper că acest lucru vă ajută.

0
adăugat

O altă funcție, nu de mine, dar găsită pe web și o rafinat un pic:

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

Doar două lucruri care îmi vin în minte: Ce zici de oameni din țări care nu folosesc calendarul gregorian? DateTime.Now este în cultura server-specifice cred. Am absolut 0 cunostinte despre lucrul cu calendarele din Asia si nu stiu daca exista o modalitate usoara de a converti datele intre calendare, dar doar daca te intrebi despre tipii chinezi de la anul 4660 :-)

0
adăugat
Aceasta pare să se ocupe de cele mai bune regiuni diferite (formate de date).
adăugat autor webdad3

Nu cred că niciunul din răspunsurile oferite până acum nu oferă culturi care calculează vârsta în mod diferit. Vedeți, de exemplu, Calculul vârstei din Asia de Est față de cel din Vest.

Orice răspuns real trebuie să includă localizarea. Model de strategie ar fi probabil în ordine în acest exemplu.

0
adăugat
@ unele - coreenii încă folosesc acest sistem în primul rând.
adăugat autor Justin L.
De fapt, acest concept poate fi destul de important - oamenilor nu le place să li se spună în mod incorect informațiile lor personale. De exemplu, jumătate din familia mea locuiește în Malaezia și jumătate în Marea Britanie. În prezent, vârsta mea este considerată cu doi ani mai mare atunci când sunt cu o parte a familiei mele decât cu cealaltă.
adăugat autor Phil Gan
Din articolul din Wikipedia pe care l-ați furnizat: "În China și Japonia se folosește pentru tradiționalul averi sau religie și dispare în viața de zi cu zi dintre popoarele din oraș".
adăugat autor some
Nu numai că ne acest sistem utilizat în principal în Coreea, ci ca un turist discuta cu vârste localnici, localnicii se vor referi politicos să le-o reciproc de anul nașterii. Eu nu sunt 25, sunt 87. Îmi place această abordare mai bună. mai mult de un "format internațional pentru data de naștere"
adăugat autor Dean Rather
Chiar și în Coreea, în timp ce acest sistem este utilizat în mod obișnuit în conversații ocazionale, în scopuri legale (cum ar fi, de exemplu, vârsta de băut) se utilizează calculul occidental. Deci, cred că doar schimbarea unei culturi este o modalitate destul de bună de a face lucruri pe care nu intenționați să le faceți.
adăugat autor Casey

Acesta este un mod ciudat de a face acest lucru, dar dacă formatați data la yyyymmdd și scădeți data nașterii de la data curentă, apoi aruncați ultimele 4 cifre pe care le-ați vârsta :)

Nu știu C #, dar cred că acest lucru va funcționa în orice limbă.

20080814 - 19800703 = 280111 

Aruncați ultimele 4 cifre = 28 .

C # Cod:

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

Sau, alternativ, fără toate tipurile de conversie sub forma unei metode de extensie. Eroare de verificare omisă:

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;
}
0
adăugat
Ar fi mai bine să adăugați un parametru float.Parse (x, CultureInfo.InvariantCulture) deoarece unii localnici folosesc virgulă în loc de punct pentru un delimitator în numere fracționate
adăugat autor krvladislav
cerând o întrebare pentru foarte vechi post int age = (acum - dob) / 10000; de ce scade cu 10000?
adăugat autor Monojit Sarkar
Valoarea DateTime.MaxValue este 9999, anul MinValue este 1, depășirea nu este posibilă.
adăugat autor Antonín Lejsek
De fapt, acest lucru este minunat pentru utilizarea pe MS-SQL cu datetime-fields (zile totale de la 01-011900)
adăugat autor Patrik Eckebrecht
@numerek Vă rugăm să postați modificările propuse ca răspuns propriu. Pentru ceea ce merită, anul curent 10000 nu este niciodată aproape de o depășire de întreg, cu două ordine de mărime. 20,150,000 vs 2,147,483,648
adăugat autor GalacticCowboy
Horray pentru yyyymmdd . Primul produs de baze de date pe care l-am folosit pe un P ersonal C (aproximativ 1981) date stocate în acest format. Manipularea datei de orice fel a fost atât de ușoară.
adăugat autor radarbob
în răspunsul dvs. alternativ, puteți evita depășirea întregului prin scăderea anilor, apoi scăderea lunii * 30,5 + zi și împărțirea cu 366
adăugat autor numerek
Acest răspuns presupune că bebelușii de sărbătoare își au zilele de naștere la 1 martie în anii care nu sunt bătrâni.
adăugat autor Jamie Kitson

O soluție ușor de înțeles și simplă.

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

Cu toate acestea, presupune că căutați ideea occidentală despre vârstă și nu folosiți Calculul din Asia de Est .

0
adăugat
@JAG: DateTime.Today ar trebui să fie chiar mai rapid.
adăugat autor Shimmy
Acest cod nu calculează cea mai apropiată vârstă. Aici este codul: var ts = DateTime.Now - new DateTime (1988, 3, 19); var var = Math.Round (ts.Days / 365.0);
adăugat autor Dhaval Panchal
Nu mai pot edita comentariul meu, deci iată corecția mea: TimeSpan difference = subject.Birthday - DateTime.Now; int age = difference.Days; Dacă doriți vârsta în ani, puteți adăuga întotdeauna int ageInYears = age / 365;
adăugat autor Nolonar
Nu ar fi mai ușor să faci doar DateTime dateDifference = subject.Birthday - DateTime.Now; int age = dateDiferența.Ava; ? De asemenea, nu cred că vârsta depinde de ani buni. La urma urmei, un an este definit ca 365 <366 de zile, anii de salt nu vă fac nici o zi mai tânără.
adăugat autor Nolonar
Sau doar dacă (BirthDate.DayOfYear> Today.DayOfYear); nu este nevoie să modificați variabilele date
adăugat autor NKCSS
@Danvil, este într-adevăr greșit? Luați un exemplu mai simplu. Ziua de naștere = 2000/02/29, Astăzi = 2001/02/28. Au trecut zilele: 365. Nu este un an și, prin urmare, nu este persoana de un an la vârsta de 28 de ani? Sau este definiția unui an 365-1 / 4 zile? Doar spun, e complicat.
adăugat autor devuxer
Ultima linie ma făcut să cred prea mult. În schimb, ce zici: dacă (bday.AddYears (vârsta)> acum) vârsta -; Aceasta pare a fi o expresie mai intuitivă.
adăugat autor cdiggins
Conceptul de măsurare a vârstei în anii este doar o minciună murdară, deoarece nu se iau în calcul anii de salt. Ar trebui să măsuram vârsta în zile.
adăugat autor Melbourne Developer
@Legends Ea face mai multe ipoteze decât au fost subliniate în răspuns, și este corect pentru cazul dvs. dacă și numai dacă aceste ipoteze dețin pentru cazul dumneavoastră. Fără să știi cazul tău, e imposibil pentru altcineva decât pentru tine să transformi asta într-un răspuns da sau nu.
adăugat autor hvd
@ LukeTO'Brien Codul if (bday> today.AddYears (-age)) vârsta -; în acest răspuns trebuie să aibă grijă de asta. age ar fi 10 în acel punct bazat pe diferența dintre numerele de an. Dacă ziua de naștere (decembrie 1990) este mai târziu de 10 ani în urmă (care ar fi martie 1990), atunci este age decrementată la 9 . Vrei să spui că nu funcționează pentru tine?
adăugat autor hvd
Este această soluție de mai sus cu peste 1400 upvotes corecte, pentru că pot citi din secțiunea de comentarii că există unele probleme cu această soluție ...?
adăugat autor Legends
Acest răspuns nu ia în calcul luna - Dacă m-am născut în decembrie 1990 și astăzi este martie 2000, vârsta mea este de 9 ani și nu 10, pentru că nu am avut încă ziua mea de naștere
adăugat autor Luke T O'Brien
Deci, avem o vârstă diferită în funcție de diferite țări și calendar? Ce ghinion ...
adăugat autor e-satis
@ LarsD "Câteva țări au omis date după nașterea celor vii" <- Ce vrei să spui?
adăugat autor cja
@Rob Cred că aveți dreptate, dar este o problemă de precizie, de obicei, numărul de zile de naștere se calculează ca oricând între orele 00:00 - 23:59:59 într-o anumită zi.
adăugat autor Tristan Warner-Smith
Având în vedere că vorbim de zile de naștere poți folosi DateTime.Today, având în vedere că partea de timp nu are relevanță.
adăugat autor Tristan Warner-Smith
Fapte rapide: acest răspuns a apărut în acest curs de pluralism , Modulul 5 - Capitolul 3.
adăugat autor displayName
este această soluție, de asemenea, căutați aproximativ luni? În caz contrar, acesta se calculează +/- 1 an
adăugat autor alpham8
@cja - Aceasta înseamnă că unele țări au făcut niște funnii cu ani în urmă pentru a sincroniza calendarele și a elimina discrepanțele! en.wikipedia.org/wiki/Gregorian_calendar poate vorbi mai multe despre el, nu am completat citit. Referirea la "Oamenii actuali" este pur și simplu de a preciza că ajustările au avut loc în secolul XX (1901-2000). O mulțime de oameni sunt încă în viață din acea perioadă! :)
adăugat autor bPratik
de ce nu folosiți TimeSpan ?
adăugat autor gldraphael
@NKCSS: Aceasta nu se ocupă de anul corect. Testarea mea arată că numai dacă (bday> now.AddYears (-age)) funcționează. Deoarece DayOfYear returnează 61 în 2012 și 60 în 2011 pentru 1 martie.
adăugat autor Guvante
Acest răspuns nu funcționează cu toate localizările și toate vârstele. Mai multe țări au ignorat datele de la nașterea celor vii, inclusiv Rusia (1918), Grecia (1924) și Turcia (1926).
adăugat autor Lars D
@LarsD deci ceea ce spui este că nu există nici o modalitate de a calcula vârsta oamenilor? Gunoi. Au mers cu calendarul lor, se pot adapta. Chiar dacă ai putea să faci o bibliotecă pentru a calcula calendarul încrucișat bazat pe localizare, a) de unde cauți această informație b) merită oare?
adăugat autor Gusdor
@ TristanWarner-Smith Ei bine, din punct de vedere tehnic. Dacă te-ai născut pe 1 ianuarie 1990 la ora 13, ești 0 la 1 ianuarie 12:59 1991, dar 1 la 1 ianuarie 1:01 pm 1991.
adăugat autor Rob
DateTime birthdate = new DateTime (2012, 11, 5); DateTime now = DateTime.Now; int ani = acum. Anul - data nașterii. dacă (acum.Month
adăugat autor Shaik Raffi
În Anglia și Țara Galilor sau în Hong Kong, o persoană născută la 29 februarie va fi legal în vârstă de 18 ani pe 1 martie. Dacă el sau ea sa născut în Taiwan, el devine legal 18 pe 28 februarie, o zi mai devreme ( Wikipedia ) Deci birthdate.AddYears (vârstă) > astăzi și birthdate> today.AddYears (-age) sunt corecte și incorecte, în funcție de jurisdicție.
adăugat autor Daniel Liuzzi
Voiam doar să comentez cu privire la performanța DateTime.Now. Dacă nu aveți nevoie de o valoare exactă a fusului orar, utilizați DateTime.UtcNow este mult mai rapidă.
adăugat autor JAG
int age = DateTime.Today.Year - bday.Year; vârstă = bday> DateTime.Today.AddYears (-age))? vârstă--: vârstă;
adăugat autor Travis
Idee bună cdiggins, dar nu funcționează ca bday.AddYears (vârstă) atunci când vârsta este de 2/29 se întoarce 2/28 la ani care nu sunt ani bătrâni ... continuați să încercați
adăugat autor Mike Polen
De fapt, încă nu este complet corect. Acest cod presupune că 'bday' este porțiunea de dată a unui DateTime. Este un caz de margine (cred că majoritatea oamenilor vor trece doar de date și nu de data-ori), dar dacă treceți într-o zi de naștere ca dată-și-timp în cazul în care timpul este mai mare de 00:00:00, Voi alerga în bug-ul Danvil a subliniat. Setarea bday = bday.Date stabileste aceasta.
adăugat autor Øyvind
@Rob În SUA, cel puțin, se acceptă că în ziua de naștere, indiferent când în ziua în care te-ai născut, se spune că ești următoarea vârstă de ani de zile. Chiar dacă cineva sa născut la ora 11:59 pe 1 ianuarie, la petrecerea de Anul Nou, când mingea va cădea, toată lumea ar accepta că vârsta ta s-ar fi schimbat, chiar dacă încă mai ești aproape 24 de ore de la nașterea ta. :) În mod legal, se spune că un individ este un an mai în vârstă de ziua lor de naștere. Fie că este vorba de 16 persoane, fie de 21 de băuturi, sau 18 de vot. Nu contează cât timp te-ai născut. În ziua de naștere ai un an m
adăugat autor jfren484
ultima ta stare aniversare> now.AddYears (-age) a fost ceva ce am primit repede din cauza postului dvs.! Mulțumesc mult
adăugat autor Avdhut Vaidya

Aceasta este versiunea pe care o folosim aici. Funcționează și este destul de simplă. Este aceeași idee ca cea a lui Jeff, dar cred că este puțin mai clară, deoarece separă logica pentru scăderea ei, deci este puțin mai ușor de înțeles.

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

Ați putea extinde operatorul ternar pentru ao face mai clară, dacă credeți că un astfel de lucru este neclar.

Evident, acest lucru se face ca o metodă de extensie pe DateTime , dar în mod clar puteți apuca acea linie de cod care face lucrarea și o puneți oriunde. Aici avem o altă suprasarcină a metodei Extension care trece în DateTime.Now , doar pentru a fi completată.

0
adăugat
Cred că acest lucru poate fi oprit într-o zi când exact unul din dataOfBirth sau dateAsAt cade într-un an jumătate. Luați în considerare vârsta unei persoane născute la 1 martie 2003 pe 29 februarie 2004. Pentru a remedia acest lucru, trebuie să faceți o comparație lexicografică a perechilor (Month, DayOfMonth) și să o utilizați pentru condiționată.
adăugat autor Doug McClean
de asemenea, nu va arăta vârsta potrivită din ziua de naștere.
adăugat autor dotjoe