Geçenlerde bir müsterimizin bir uygulamasinin belirli tarih araliginda çalisan bir algoritmasinin gerektigi gibi çalismadiginin farkina vardim. Algoritma kisaca söyle; bir uygulama belirlenen iki saat dilimi arasinda çalismasi gerekiyor. Ama belirlenen saat dilimlerinin disinda ise çalismamasi gerekiyor. Bu düzenlemenin yapildigi bir baska arayüz var ve orada hangi günler ve hangi saaatler araliginda çalismasi isteniyor ise ilgili arayüzden düzenlenebiliyor. Burasi konu disi oldugu için çok detaya girmeyecegim.

Gelelim konumuza, zaman araligi algoritmasi baslangiç saati olarak bugün verilip, bitis saati olarak ertesi gün içierisinde bir saat verilir ise dogru çalismiyordu. Benzer mantigi google ile arattigimda suradaki stackoverflow linkinde bazi çözümler gördüm ancak baska bir çözüm o anda aklimda olustu. Buna göre bir gün 24 saattir ve bunu bir daire etrafina dizdigimizde her bir saat araligi 360 / 24 = 15 º ve her bir dakika da 15 / 60 = 0.25 º olur.

Buradan yola çikarak baslangiç ve bitis saatlerinin daire üzerindeki açilarini belirleyip, içinde bulunulan zamanin bu dairedeki konumunun, baslangiç ve bitis açilari arasinda olmasi tüm kosullarda dogru sonuç verecektir.

Kodlayacak olursak;

 

DateTime now = DateTime.Now;
TimeSpan startTime = Convert.ToDateTime(dt.Rows[0]["StartTime"]).TimeOfDay;
TimeSpan finishTime = Convert.ToDateTime(dt.Rows[0]["FinishTime"]).TimeOfDay;

//1 minute = 0.25 degree
double startAngle = startTime.TotalMinutes * 0.25;
double finishAngle = finishTime.TotalMinutes * 0.25;
double currentAngle = now.TimeOfDay.TotalMinutes * 0.25;
if (startAngle > finishAngle)
{
     if (((startAngle + (360.0 - Math.Abs(finishAngle - startAngle))) % 360.0) >= currentAngle)
     {
          tFlag = true;
     }
}
else
{
     if (currentAngle >= startAngle && currentAngle <= finishAngle)
     {
          tFlag = true;
     }
}

Buradaki tFlag degerinin true olmasi içinde bulundugumuz zamanin çalisma saatleri araliginda oldugunu belirtir.

Saglicakla kalin :)

If you like this, follow my RSS channel!