Soru Birinin yaşını C # cinsinden nasıl hesaplarım?


Verilen bir DateTime Bir kişinin doğum gününü temsil etmek, yaşlarını yıllar içinde nasıl hesaplayabilirim?


1744


Menşei


Şimdiye kadar cevapların tümünün cevapsız kalması, kişinin doğduğu yere ve şu anda nerede olduğuna bağlı olmasıdır. - Yaur
@Yaur: Sadece şimdi + doğum zamanını GMT / UTC'ye dönüştürün, yaş sadece göreceli bir değerdir, bu nedenle zaman dilimlerinin önemi yoktur. Kullanıcının mevcut saat dilimini belirlemek için GeoLocating'i kullanabilirsiniz. - Stefan Steiger
Neden [Julian Date] [1] düşünün? [1]: stackoverflow.com/questions/7103064/... - Muhammad Hewedy
Eğer Zamur'un çapraz-zaman dilimi hesaplamaları önerisini dikkate alırsak, Gün Işığından Tasarruf Süreleri hesaplamayı herhangi bir şekilde etkiler mi? - DDM
Kimse sıçrama yıllarını düşünmedi mi? ya da ayı kontrol etmek? - Crash Override


Cevaplar:


Anlaması kolay ve basit bir çözüm.

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

Ancak, bu sizin batı yaş ve kullanmayan fikir Doğu Asya hesabı.


1721



Sadece DateTime.Now performansı hakkında yorum yapmak istedim. Doğru bir saat dilimi değerine ihtiyacınız yoksa DateTime.UtcNow çok daha hızlı kullanın. - JAG
Biz doğum günleri konuşuyoruz sadece DateTime.Today kullanabilirsiniz, çünkü zaman bölümünün hiçbir alakası yoktur. - Tristan Warner-Smith
Bu cevap, tüm yerel ve tüm yaşlarla çalışmaz. Birçok ülke, Rusya (1918), Yunanistan (1924) ve Türkiye (1926) dahil olmak üzere mevcut yaşayan insanların doğumundan sonra tarihleri ​​atladı. - Lars D
Aslında, hala tamamen doğru değil. Bu kod, "bday" ın bir DateTime'ın tarih kısmı olduğunu varsayar. Bu bir uç durumdur (sanırım çoğu insan sadece tarihlerini değil, tarihlerini geçiyor olacak), ama eğer doğum gününü 00:00:00 'dan daha büyük olan bir tarih-zaman olarak geçirirseniz Danvil'in dikkat çektiği hataya koşun. Bday = bday.Date ayarı bunu düzeltir. - Øyvind
Son satır beni çok fazla düşünmemi sağladı. Bunun yerine ne hakkında: if (bday.AddYears (yaş)> şimdi) yaş-- Bu daha sezgisel bir ifade gibi görünüyor. - cdiggins


Bu, bunu yapmak için garip bir yoldur, ancak tarihi biçimlendirirseniz yyyymmdd ve geçerli tarihten itibaren doğum tarihini çıkartın ve sonra yaşınıza sahip olduğunuz son 4 haneyi bırakın :)

C # bilmiyorum, ama bunun herhangi bir dilde çalışacağına inanıyorum.

20080814 - 19800703 = 280111 

Son 4 haneyi bırakın = 28.

C # Kodu:

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

Veya alternatif olarak tüm tip dönüşümü olmayan bir uzantı biçimi biçiminde. Göz atmayı kontrol etme hatası:

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



İçin horray yyyymmdd. Üzerinde kullandığım 1. veritabanı ürünü Pişisel Computer (yaklaşık 1981) bu formatta tarihleri ​​saklar. Her türlü tarih manipülasyonu çok daha kolaydı. - radarbob
Aslında bu datetime alanları ile MS-SQL üzerinde kullanım için harika (01-011900 tarihinden itibaren toplam gün sayısı) - Patrik Eckebrecht
@numerek Lütfen önerilerinizi kendi cevapları olarak gönderin. Değeri için, 10000 yılı, iki büyüklük sırasına göre bir tamsayı taşma noktasına yakın değildir. 20.150.000 vs 2,147,483,648 - GalacticCowboy
@LongChalk 20180101 - 20171231 = 8870. Son 4 haneyi bırakın ve (ima ediyor) var 0 yaş için. Nasıl aldın 1? - Rufus L
@flindeberg Evet, LongChalk'a söylediğim şey buydu ... - Rufus L


Yanlış çözümün nasıl kabul edileceğini bilmiyorum. Doğru C # snippet'i Michael Stum tarafından yazılmıştır.

İşte bir test snippet'i:

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

İşte size yöntemleri:

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



Çıktı -Test 9 9 8 - MoXplod
Bu kod çalışırken, bir sıçrama gününde doğmuş bir insanın, 1 Mart'ta, 28 Şubat'tan ziyade, 1 yıl boyunca, devam eden yıllarda gerçekleştiğini iddia eder. Gerçekte, her iki seçenek de doğru olabilir. Wikipedia'nın bunun hakkında söyleyecekleri bir şey var. Yani kodunuz "yanlış" değilken, kabul edilen çözüm de değildir. - Matt Johnson
@MattJohnson Bence bu gerçekten doğru. Eğer bday 29 Şubat ise, o zaman 28 Şubat bdayım geçmedi ve hala 27 Şubat'takiyle aynı yaşta olmam gerekiyor. Ancak 1 Mart'ta bdayı geçtik ve bir sonraki yaştaydım. ABD'de, alkol satan bir işletmenin "YYYY'de bu günden sonra doğmuş olsaydınız, alkol satın alamazsınız" gibi bir şeye işaret eder (YYYY her yıl değişir). Bu, 29 Şubat'ta doğan birinin 21 Şubat'ta (çoğu yerde) 28 Şubat'ta alkol satın alamayacağı anlamına gelir ve 1 Mart'a kadar bir yaşta olmadıkları fikrine destek verir. - jfren484
@ jfren484 - Wikipedia makalesini okuyun. Yargı bölgelerinde önemli ölçüde değişmektedir. - Matt Johnson
@ jfren484 Talebinizin kesinlikle felsefe ile ilgisi yoktur; ama her şey ile ilgili kendi kişisel hissin. Bir yaşın “yasal yaş sınırı” oluşturmaması halinde (örneğin, alkol satın alabilir, oy toplayabilir, emekli maaşı alabilir, orduya katılabilir, sürücü ehliyetine sahip olabilir), 29 Şubat "doğumları" nda doğan bir kişi büyük ölçüde önemsizdir. ABD'nin içme yaşını (21 yıl) düşünün: Çoğu insan için 7670 gün. Sıçrama yılda 29 Şubat'tan önce, ya da artık yıldan 1 ay önce 7671 gün. Eğer 29 Şubat doğumluysa: 28 Şubat 7670 gün ve 1 Mar 7671 gündür. Seçim keyfi Öyle yada böyle gidebiliyor. - Craig Young


Şimdiye kadar cevapların hiçbirini yaşları farklı şekilde hesaplayan kültürler için hiç bir şey düşünmüyorum. Örneğin, bkz. Doğu Asya Çağı Muhasebesi Batıda buna karşı.

herhangi gerçek cevap yerelleştirmeyi içermelidir. Strateji Modeli muhtemelen bu örnekte olacaktır.


115



Sağladığınız wikipedia makalesinden: "Çin ve Japonya'da geleneksel falcılık veya din için kullanılır ve kentteki halklar arasındaki günlük hayatta yok olur." - some
@some - Koreliler öncelikle bu sistemi kullanıyorlar. - Justin L.
Aslında bu kavram oldukça önemli olabilir - insanlar kişisel bilgilerini yanlış bir şekilde söylemekten hoşlanmıyorlar. Örnek olarak, ailemin yarısı Malezya’da, yarısı Birleşik Krallık’ta yaşıyor. Şu anda benim ailemin bir yanında diğeriyle yaşımdayken yaşım iki yıl daha yüksek kabul ediliyor. - Phil Gan
Sadece bizzat Kore'de kullanılan bu sistem değil, aynı zamanda yerli halk ile yaşları tartışan bir turist olarak, yerliler, kendi doğum yıllarına göre birbirlerini kibarca anlatacaklardır. 25 yaşındayım, 87 yaşındayım. Bu yaklaşımı daha çok seviyorum. 'uluslararası birthdatetime biçiminin' daha fazlası - Dean Rather
Vietnam'da, günlük yaşamda, Batılı sistem kullanıldığında bile, yaş sadece yılların çıkarılmasıyla hesaplanır. Tarih hariç tutuldu - phuclv


Bunun basit cevabı uygulamaktır AddYears Aşağıda gösterildiği gibi, bu 29 yıllık sıçrama yıllarına yıl eklemek ve ortak yıllar için 28 Şubat'ın doğru sonucunu almak için tek yerli yöntemdir.

Bazıları Marx'in 1'inin atlayışların doğum günü olduğunu düşünür, fakat ne de .Net veya herhangi bir resmi kural bunu desteklemez, ya da ortak mantık, Şubat ayında doğanların neden başka bir ayda doğum günlerinin% 75'ine sahip olduğunu açıklayamaz.

Dahası, bir Yaş metodu kendini bir uzatma olarak eklenmeye borçludur. DateTime. Bununla yaşınızı mümkün olan en basit şekilde edinebilirsiniz:

  1. Liste öğesi

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

Şimdi, bu testi çalıştırın:

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

Kritik tarih örneği şudur:

Doğum tarihi: 2000-02-29 Geçerlilik tarihi: 2011-02-28 Yaş: 11

Çıktı:

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

Ve daha sonraki tarih için 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 Mart'ta 29 Şubat doğum gününe sahip olmanın teknik olarak 28'inde olmasıyla ilgili bir yorum çok erken (aslında 1 gün erken). 1'inde bir gün çok geç. Ama doğum günü arasında olduğu için, 1 yılını kullanarak sıçrama olmayan yıllarda yaşı hesaplamak benim için daha anlamlı olur, çünkü o kişi gerçekten 1 Mart'ta (ve 2. ve 3.) her yıl, ancak 28 Şubat'ta değil. - CyberClaw


Benim önerim

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

Bu, yılın doğru gününde değişiyor gibi görünüyor. (107 yaşına kadar test ettim)


76



365.255 nereden geliyor? Bunun genel olarak işe yaramayacağını düşünüyorum. - dreeves
Bir yıldaki günler için 365. Artık yıl için +0.25. Diğer düzeltmeler için +0.005 - James Curran
Harry Patch'in spot test metodolojinizi takdir edeceğini sanmıyorum: latimes.com/news/obituaries/... - MusiGenesis
Gregoryen Takvimi'nde bir yılın ortalama uzunluğu 365.2425 gündür. - dan04
^ ^ Bazen bazen önemlidir. Testlerimde bu, doğum günlerinde başarısız oluyor, onlara daha genç olduklarını bildiriyor. - ChadT


Başka bir işlev, bana göre değil, internette bulundu ve biraz geliştirdi:

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

Aklıma gelen iki şey: Yunanlı takvimi kullanmayan ülkelerden ne haber? DateTime.Now, sunucuya özgü kültür bence. Ben aslında Asya takvimleri ile çalışan hakkında 0 bilgi var ve takvimler arasında tarihleri ​​dönüştürmek için kolay bir yol olup olmadığını bilmiyorum, ama sadece bu 4660 yıl o çince çocuklar hakkında merak ediyorsanız :-)


65



Bu, farklı bölgeleri (tarih biçimleri) en iyi şekilde ele alır. - webdad3