BİLGİ SAYAMIYORUM beta

C# da artık yılları da hesaba katarak yaş nasıl hesaplanır?

0

Obje temelli diller bazen işleri ne kadar da eğlenceli hale getiriyor diye sayabilirsin ama aslında durum biraz farklı. Tarih hesaplamak en basit işlemlerden biri tabii ki: bugün-doğumgünü, ancak artık yıllar bu denklemi biraz bozabiliyor. Bu işlemi düzgün yapmanın birden çok yolu var:

     var bugun = DateTime.Today;
     var yas = today.Year - dogumgunu.Year;

     if (dogumgunu > today.AddYears(-yas)) yas--;

C# zamanları ile ilgili ekstra not: DateTime.Now Güneş saati kafasına göre değişen tarihleri hesaplaması sebebiyle DateTime.UtcNow işleminden daha yavaş çalışıyor. 

Bugünü alıp, doğumgünü tarihi olarak belirlenen değişkenden çıkarıyoruz, sonra da artık yıl var ise ona göre yas ifadesini azaltıyoruz. Bu formül bazı özel durumlara göre değiştirmeniz mümkün, mesela; if kontrolündeki "dogumgunu" ifadesi saat bakımından sorun yaratırsa, dogumgunu.date yapabilirsiniz. Bu artık yılla ilgili sorunu farklı durumlar için test edip 28 şubat, 1 mart kavgası yüzünden başka sonuç da alınabilir, mesela:

     DateTime dogumgunu = new DateTime(1987, 2, 29);
     DateTime bugun = new DateTime(2017, 2, 28);
     MessageBox.Show(string.Format("{0}", yasHesapla(dogumgunu, bugun)));

     public int yasHesapla(DateTime birthDate, DateTime now) {
          int yas = now.Year - birthDate.Year;
          if (now.Month < birthDate.Month || (now.Month == birthDate.Month && now.Day < birthDate.Day)) yas--;
          return yas;
     }

Eğer tarih size "yyyymmdd" şeklinde geliyorsa bu yapıyı kullanarak da yaş hesaplayabilirsiniz, süreleri birbirinden çıkarıp, son dört hanesini atıyor:

     int bugun = int.Parse(DateTime.Now.ToString("yyyyMMdd"));
     int dogumgunu = int.Parse(dateOfBirth.ToString("yyyyMMdd"));
     int yas = (bugun - dogumgunu) / 10000;

Bu yöntemi uzun olarak şöyle de gösterebiliriz:

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

Bunun dışında, en azından doğum tarihi hesaplarken çok kullanmasanız da 100 yılı aşkın hesaplamalar, karşılaştırmalar için bilmeniz gereken bazı şeyler var. Julian takvimi (ki şu an kendisi 13-14 gün geride) fazla artık yıla sebep olduğu için şu an kullandığımız Gregoryan takvimine (mükemmel değil, her 3200 senede 1 fazladan yılı var (:)  geçilirken belli sorunlar atlamalar yaşandı. Mesela İsveç ve Norveç 1712 de çift artık yıl eklemiş ama aşağıdaki ülkeler geçiş sırasında gün silmek zorunda kalmış:

Abi işi son güne bırakmayın (: Türkiye ile 300 yıllık geçiş tamamlanmış gibi duruyor.

BENZER 7

Kimse etkileşime girmemiş

ETİKETLER