Anneler gününü bulma

Elinizde bir tarih bilgisi var diyelim, bu tarihin anneler günü olup olmadığını nasıl anlarsınız?

Diyelim ki elinizde şu şekilde bir tarih bilgisi var:

int YIL = 2009;
int AY = 5;
int GUN = 10;
        

Bu tarih, biz biliyoruz ki 10 Mayıs 2009'u yani anneler gününü gösteriyor, peki bunu bizim programımız nasıl bilecek?

Askerlik görevimi yerine getirirken bir program üzerinde çalışıyordum ve bu soru ile karşı karşıya kalmıştım. Yarım gün boyunca tek bir formül ile acaba verilen bir tarihin, her yıl belirli bir ayın belirli bir haftasının belirli bir gününe denk gelip gelmediğini nasıl bulabilirim diye düşünmüştüm.

Bahsettiğim her yıl belirli bir ayın belirli bir haftasının belirli bir günü olan tarihlerden birkaçı şu şekilde:

  • Anneler günü (Mayıs ayının 2. pazarı)
  • Babalar günü (Haziran ayının 3. pazarı)
  • Çevre Koruma Haftası (Haziran ayının 2. haftası)
  • Enerji Tasarrufu Haftası (Ocak ayının 2. haftası)
  • Girişimcilik Haftası (Mart ayının ilk haftası)
  • İlköğretim Haftası (Eylül ayının 3. haftası)
  • ...

O zamanlar Visual Basic ile kod yazıyordum. Oluşturduğum bu formülün C# karşılığını aşağıda bulabilirsiniz:

// Elimizdeki tarih bilgisi
// 10 Mayıs 2009 olsun
int YIL = 2009;
int AY = 5;
int GUN = 10;

// Örnek:
// her yıl mayıs ayının 2. pazarı = anneler günü
int ay = 5; // mayıs
int hafta = 2; // 2.
int gun = 7;  // pazar

// ayın 1. günü hangi güne denk geliyor?
// burada 0=paz, 1=pzts,... 6=cmts şeklinde sıralanıyor.
// formülde lazım olan 1=pzts, 2=sal, ... 7=paz
int dow = (int) new DateTime(YIL, ay, 1).DayOfWeek;
if(dow == 0) dow = 7;

if(new DateTime(YIL, AY, GUN).Equals(new DateTime(YIL, ay,
	1 - dow + (hafta - Convert.ToInt32(gun >= dow)) * 7 + gun)))
  {
     Console.WriteLine("Anneler günü bugün");
  }
 

Kim bilir belki bir gün birisinin işine yarayabilir. :)