सवाल मैं सी # में किसी की उम्र की गणना कैसे करूं?


एक दिया गया DateTime किसी व्यक्ति के जन्मदिन का प्रतिनिधित्व करते हुए, मैं वर्षों में उनकी उम्र की गणना कैसे करूं?


1744


मूल


अब तक के सभी उत्तरों क्या चूक गए हैं यह है कि यह निर्भर करता है कि व्यक्ति कहां पैदा हुआ था और वे अभी कहां हैं। - Yaur
@Yaur: बस जीएमटी / यूटीसी में अब + जन्म का समय परिवर्तित करें, उम्र केवल एक सापेक्ष मूल्य है, इसलिए टाइमज़ोन अप्रासंगिक हैं। उपयोगकर्ता के वर्तमान टाइमज़ोन को निर्धारित करने के लिए, आप भू-आवंटन का उपयोग कर सकते हैं। - Stefan Steiger
[जूलियन तिथि] पर विचार क्यों नहीं करें [1]? [1]: stackoverflow.com/questions/7103064/... - Muhammad Hewedy
यदि हम क्रॉस-टाइमज़ोन गणनाओं के @Yaur के सुझाव पर विचार कर रहे हैं, तो डे लाइट सेविंग टाइम किसी भी तरीके से गणना को प्रभावित करेगा? - DDM
किसी ने लीप साल नहीं माना है? या महीने की जांच? - Crash Override


जवाब:


समझने में आसान और सरल समाधान।

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

हालांकि, यह मानता है कि आप इसकी तलाश में हैं पश्चिमी उम्र का विचार और उपयोग नहीं कर रहा है पूर्वी एशियाई गणना


1721



बस डेटटाइम.अब प्रदर्शन पर टिप्पणी करना चाहता था। यदि आपको सटीक समय क्षेत्र मान की आवश्यकता नहीं है, तो डेटटाइम का उपयोग करें। UtcNow यह बहुत तेज़ है। - JAG
यह देखते हुए कि हम जन्मदिन की बात कर रहे हैं, आप बस डेटटाइम का उपयोग कर सकते हैं। आज दिया गया समय भाग में कोई प्रासंगिकता नहीं है। - Tristan Warner-Smith
यह उत्तर सभी लोकेशंस और सभी उम्र के साथ काम नहीं करता है। रूस (1 9 18), ग्रीस (1 9 24) और तुर्की (1 9 26) समेत मौजूदा जीवित लोगों के जन्म के बाद कई देशों ने तारीखों को छोड़ दिया है। - Lars D
असल में, यह अभी भी पूरी तरह से सही नहीं है। यह कोड मानता है कि 'बडे' डेटटाइम का दिनांक-भाग है। यह एक एज-केस है (मुझे लगता है कि ज्यादातर लोग सिर्फ तारीखें पारित करेंगे और दिनांक-समय नहीं), लेकिन यदि आप जन्मदिन में डेट-एंड-टाइम के रूप में पास करते हैं जहां समय 00:00:00 से अधिक है तो आप ' डैनविल ने बग में भाग लिया। Bday = bday.Date को सेट करना यह ठीक करता है। - Øyvind
आखिरी पंक्ति ने मुझे बहुत ज्यादा सोचा। इसके बजाए कैसे: अगर (bday.AddYears (उम्र)> अब) उम्र -; यह एक और सहज ज्ञान युक्त अभिव्यक्ति प्रतीत होता है। - cdiggins


यह करने का यह एक अजीब तरीका है, लेकिन यदि आप तिथि को प्रारूपित करते हैं yyyymmdd और वर्तमान तिथि से जन्मतिथि घटाएं और आखिरी 4 अंकों को छोड़ दें जो आपको उम्र है :)

मुझे सी # नहीं पता, लेकिन मेरा मानना ​​है कि यह किसी भी भाषा में काम करेगा।

20080814 - 19800703 = 280111 

अंतिम 4 अंक = ड्रॉप करें 28

सी # कोड:

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

या वैकल्पिक रूप से एक विस्तार विधि के रूप में सभी प्रकार के रूपांतरण के बिना। छोड़े गए त्रुटि की जांच:

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

894



के लिए होरे yyyymmdd। 1 डेटाबेस डेटाबेस जो मैंने प्रयोग किया था पीersonal सीओम्प्यूटर (लगभग 1 9 81) इस प्रारूप में संग्रहीत तिथियां। किसी भी तरह की तारीख में हेरफेर इतना आसान था। - radarbob
दरअसल यह एमएस-एसक्यूएल पर डेटाटाइम-फ़ील्ड (01-011900 के बाद से कुल दिन) के उपयोग के लिए बहुत अच्छा है। - Patrik Eckebrecht
@numerek कृपया अपने सुझाए गए संशोधनों को अपने उत्तर के रूप में पोस्ट करें। इसके लायक होने के लिए, वर्तमान वर्ष के समय 10000 परिमाण के दो आदेशों से, पूर्णांक ओवरफ़्लो के पास कहीं भी नहीं है। 20,150,000 बनाम 2,147,483,648 - GalacticCowboy
@LongChalk 20180101 - 20171231 = 8870। अंतिम 4 अंकों को छोड़ दें और आपके पास (एक अंतर्निहित) 0 उम्र के लिए। आपको कैसे मिला 1? - Rufus L
@flindeberg हाँ, यही वह है जो मैं LongChalk को कह रहा था ... - Rufus L


मुझे नहीं पता कि गलत समाधान कैसे स्वीकार किया जा सकता है। सही सी # स्निपेट माइकल स्टम द्वारा लिखा गया था

यहां एक परीक्षण स्निपेट है:

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

यहां आपके पास विधियां हैं:

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

345



आउटपुट था -स्ट 9 9 8 - MoXplod
हालांकि यह कोड काम करता है, यह दावा करता है कि एक लीप दिवस पर पैदा होने वाला व्यक्ति 28 मार्च को गैर-लीप वर्षों पर अगले वर्ष की आयु को अगले वर्ष प्राप्त करता है। वास्तव में, या तो विकल्प सही हो सकता है। विकिपीडिया के बारे में कुछ कहना है। इसलिए जब आपका कोड "गलत" नहीं है, न तो स्वीकार्य समाधान है। - Matt Johnson
@MattJohnson मुझे लगता है कि वास्तव में सही है। अगर मेरा बडे 2 9 फरवरी था, तो 28 फरवरी को मेरा बडे पास नहीं हुआ है, और मुझे अभी भी 27 फरवरी को वही उम्र होनी चाहिए। हालांकि, 1 मार्च को, हमने अपना बडे पास कर दिया है और मुझे अगली उम्र होनी चाहिए। अमेरिका में, शराब बेचने वाला एक व्यवसाय एक संकेत होगा जो कुछ कहता है "अगर आप इस दिन के बाद पैदा हुए थे, तो आप शराब नहीं खरीद सकते" (जहां हर साल YYYY बदलता है)। इसका मतलब है कि 2 9 फरवरी को पैदा हुआ कोई व्यक्ति 28 फरवरी को अल्कोहल नहीं खरीद सकता है, जिस दिन वे 21 (अधिकतर जगहों) को बदल देते हैं, और इस विचार को समर्थन देते हैं कि वे 1 मार्च तक सालाना नहीं हैं। - jfren484
@ jfren484 - विकिपीडिया लेख पढ़ें। यह क्षेत्राधिकारों में काफी भिन्न होता है। - Matt Johnson
@ jfren484 आपके दावे के दर्शन के साथ बिल्कुल कुछ नहीं है; लेकिन सब कुछ करने के लिए आपकी व्यक्तिगत भावना। जब 2 9 फरवरी "उम्र" पर पैदा हुआ व्यक्ति काफी हद तक महत्वहीन नहीं होता है जब तक कि उम्र 'कानूनी आयु सीमा' नहीं बनती है (उदाहरण के लिए शराब खरीदना, वोट देना, पेंशन प्राप्त करना, सेना में शामिल होना, ड्राइविंग लाइसेंस प्राप्त करना)। अमेरिकी पीने की उम्र पर विचार करें (21 वर्ष): 7670 दिनों के अधिकांश लोगों के लिए। यह 7671 दिन है यदि 2 9 फरवरी से पहले लीप वर्ष में या लीप वर्ष से पहले 1 मार्च से पहले पैदा हुआ था। अगर 2 9 फरवरी को पैदा हुआ: 28 फरवरी 7670 दिन और 1 मार्च 7671 दिन है। पसंद मनमाने ढंग से है यह किसी भी तरह जा सकता है। - Craig Young


मुझे नहीं लगता कि अब तक कोई भी उत्तर उन संस्कृतियों को प्रदान करता है जो उम्र की गणना अलग-अलग करते हैं। देखें, उदाहरण के लिए, पूर्वी एशियाई आयु गणना पश्चिम में बनाम बनाम।

कोई असली जवाब स्थानीयकरण शामिल करना है। रणनीति पैटर्न शायद इस उदाहरण में क्रमशः होगा।


115



आपके द्वारा प्रदान किए गए विकिपीडिया लेख से: "चीन और जापान में इसका उपयोग पारंपरिक भाग्य-कहने या धर्म के लिए किया जाता है, और यह शहर के लोगों के बीच दैनिक जीवन में गायब हो रहा है।" - some
@some - Koreans अभी भी मुख्य रूप से इस प्रणाली का उपयोग करें। - Justin L.
असल में यह अवधारणा बहुत महत्वपूर्ण हो सकती है - लोगों को अपनी निजी जानकारी गलत तरीके से नहीं बताया जा रहा है। उदाहरण के तौर पर, मेरे परिवार का आधा मलेशिया में रहता है और ब्रिटेन में आधा रहता है। अभी मेरी उम्र दो साल से अधिक मानी जाती है जब मैं अपने परिवार के एक तरफ से दूसरे के साथ हूं। - Phil Gan
न केवल हमें यह प्रणाली कोरिया में मुख्य रूप से उपयोग की जाती है, बल्कि स्थानीय लोगों के साथ उम्र के बारे में चर्चा करने वाले पर्यटक के रूप में, स्थानीय लोग अपने जन्म वर्ष से विनम्रतापूर्वक एक दूसरे को संदर्भित करेंगे। मैं 25 वर्ष का नहीं हूं, मैं 87 वर्ष का हूं। मुझे यह दृष्टिकोण बेहतर लगता है। एक 'अंतरराष्ट्रीय जन्मदिन का प्रारूप' - Dean Rather
वियतनाम में, दैनिक जीवन में भी जब पश्चिमी प्रणाली का उपयोग किया जाता है, तो उम्र की गणना केवल वर्षों को घटाकर की जाती है। तारीख को बाहर रखा गया है - phuclv


इसका सरल जवाब लागू करना है AddYears जैसा कि नीचे दिखाया गया है क्योंकि यह लीप वर्षों के 2 9 फरवरी को साल जोड़ने और आम वर्षों के लिए 28 फरवरी के सही परिणाम प्राप्त करने का एकमात्र मूल तरीका है।

कुछ लोगों का मानना ​​है कि 1 मार्च मार्च लीपलिंग का जन्मदिन है, न तो नेट। न ही कोई आधिकारिक नियम इसका समर्थन करता है, न ही आम तर्क बताता है कि फरवरी में पैदा हुए कुछ लोगों को अपने जन्मदिन का 75% अन्य महीने में क्यों होना चाहिए।

इसके अलावा, एक आयु विधि स्वयं को विस्तार के रूप में जोड़ने के लिए उधार देती है DateTime। इसके द्वारा आप उम्र को सबसे आसान तरीके से प्राप्त कर सकते हैं:

  1. सामग्री सूचीबद्ध करें

int आयु = जन्मदिन। एज ();

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

अब, इस परीक्षण को चलाएं:

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

महत्वपूर्ण तिथि उदाहरण यह है:

जन्म तिथि: 2000-02-29 बाद की तिथि: 2011-02-28 आयु: 11

आउटपुट:

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

और बाद की तारीख 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



1 मार्च को 2 9 फरवरी का जन्मदिन होने के बारे में एक टिप्पणी, तकनीकी रूप से, इसे 28 वें स्थान पर रखना बहुत जल्दी है (वास्तव में 1 दिन पहले)। 1 दिन बहुत देर हो चुकी है। लेकिन जन्मदिन के बीच में, गैर-लीप वर्षों में उम्र की गणना करने के लिए 1 का उपयोग करने से मुझे और अधिक समझ आती है, क्योंकि वह व्यक्ति वास्तव में 1 मार्च (और 2 और 3) पर हर साल पुराना है, लेकिन 28 फरवरी को नहीं। - CyberClaw


मेरा सुझाव

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

ऐसा लगता है कि वर्ष सही तिथि पर बदल रहा है। (मैं 107 साल की उम्र तक परीक्षण किया गया)


76



365.255 कहां से आता है? मुझे नहीं लगता कि यह सामान्य रूप से काम करेगा। - dreeves
एक वर्ष में दिनों के लिए 365। लीप वर्षों के लिए +0.25। अन्य सुधारों के लिए +0.005 - James Curran
मुझे नहीं लगता है कि हैरी पैच ने आपकी स्पॉट-टेस्टिंग पद्धति की सराहना की होगी: latimes.com/news/obituaries/... - MusiGenesis
ग्रेगोरियन कैलेंडर में एक वर्ष की औसत लंबाई 365.2425 दिन है। - dan04
^^ क्योंकि कभी-कभी यह महत्वपूर्ण है। मेरे परीक्षण में यह व्यक्तियों के जन्मदिन पर विफल रहता है, यह उन्हें उनके मुकाबले कम रिपोर्ट करता है। - ChadT


एक और समारोह, मेरे द्वारा नहीं बल्कि वेब पर पाया गया और इसे थोड़ा सा परिष्कृत किया:

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

सिर्फ दो चीजें जो मेरे दिमाग में आती हैं: उन देशों के लोगों के बारे में क्या जो ग्रेगोरियन कैलेंडर का उपयोग नहीं करते हैं? डेटटाइम.अब मुझे लगता है कि सर्वर-विशिष्ट संस्कृति में है। मेरे पास एशियाई कैलेंडर के साथ वास्तव में काम करने के बारे में बिल्कुल 0 ज्ञान है और मुझे नहीं पता कि कैलेंडरों के बीच तिथियों को बदलने का कोई आसान तरीका है, लेकिन अगर आप 4660 :-) से उन चीनी लोगों के बारे में सोच रहे हैं


65



यह विभिन्न क्षेत्रों (दिनांक प्रारूप) को सर्वोत्तम रूप से संभालने के लिए प्रतीत होता है। - webdad3


मैं पार्टी के लिए देर हो चुकी हूं, लेकिन यहां एक लाइनर है:

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

44



यह टूट गया है. टेस्टेबल बनाया गया: सार्वजनिक स्थैतिक int गणना गणना (डेटटाइम दिनांकऑफबर्थ, डेटटाइम डेट टूक्यूल्यूलेटएज) {नया डेटटाइम लौटें (dateToCalculateAge.Subtract (dateOfBirth) .Ticks) .Year - 1; } ... जब मैं 1 99 0-06-01 इनपुट करता हूं और 14 वें जन्मदिन (1 99 0-05-31) से पहले दिन की उम्र की गणना करता हूं तो उम्र 14 देता है। - Kjensen