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ış:
- 1582 France (çoğunluk), Italy, Poland, Portugal, Spain 10 gün
- 1583 Austria, Germany (Katolik bölgeler), 10 days 1587 Hungary, 10 gün
- 1610 Germany (Prussia), 10 gün
- 1752 United States (çoğunluk), Canada (çoğunluk), United Kingdom (ve koloniler) 11 gün
- 1872/1873 Japan, 12 gün
- 1916 Bulgaria, 13 gün
- 1918 Estonia, Russia, 13 gün
- 1923 Greece, 13 gün
- 1926/1927 Turkey, 13 gün
Abi işi son güne bırakmayın (: Türkiye ile 300 yıllık geçiş tamamlanmış gibi duruyor.