Tarih Hesaplayıcılarının İşleyişi ve Hesaplama Yöntemleri
Günlük kullandığımız takvim karmaşık bir yapıya sahiptir. Aylar farklı sayıda gün içerir ve yıllarda dört yılda bir fazladan bir gün ortaya çıkar. Bu düzensizlik nedeniyle tarih hesaplamaları için sıradan matematiği kullanmak mümkün değildir. Tarih hesaplayıcısı için sadece sayıları toplamak veya çıkarmak yeterli değildir, özel bir dönüştürme algoritması gereklidir.
Herhangi bir tarih hesaplayıcısının temelinde, takvim tarihini doğrusal bir formata dönüştürme kavramı yatar. Bu, zamanla her gününe kendi sıra numarası atanmış sürekli bir doğru olarak çalışmak için gereklidir.
Tarihlerin Doğrusal Temsili ve Başlangıç Noktası
Sistem, 15 Mart'ı 10 Şubat'tan doğrudan "çıkaramaz", çünkü bu tarihler farklı gün sayılarına sahip farklı aylara aittir. Bu sorunu çözümlemek için hesaplayıcı "çağ" kullanır – geçmişte kesin olarak belirlenmiş ve sıfır noktası olarak kabul edilen bir tarih.
Kullanıcı bir tarih girer, algoritma yerleşik takvime başvurur ve çağdan belirtilen tarihe kadar kaç gün geçtiğini hesaplar. Bu anda takvim sıradan bir sayı dizisine dönüşür: 1, 2, 3, 4 ve benzeri.
Tarihler Arasındaki Farkı Hesaplama Yöntemi
İki olay arasındaki gün sayısını öğrenmek gerektiğinde, algoritma katı bir sırayla çalışır.
- İlk girilen tarih sayısal formata dönüştürülür (çağdan itibaren gün sayısı).
- İkinci girilen tarih de aynı şekilde sayısal formata dönüştürülür.
- Büyük sayıdan küçük sayı çıkarılır.
Elde edilen sonuç, olaylar arasındaki tam takvim günü sayısıdır. Kullanıcıya sonuç yıl ve ay olarak gerekiyorsa, hesaplayıcı sayıyı 30 veya 365'e bölmez. Algoritma, elde edilen gün sayısını başlangıç tarihinden "geriye doğru" hesaplamaya başlar, tam yılları ayrı, ardından tam ayları ayrı sayar ve sadece kalan kısmı gün olarak gösterir.
Aralık Ekleme ve Çıkarma Algoritması
Basit gün ekleme doğrusal model üzerinden çalışır: başlangıç tarihinin sıra numarasına gerekli gün sayısı eklenir ve ardından sonuç tekrar takvime dönüştürülür. Ancak ay ve yıl ekleme durumunda, farklı uzunluktaki ayların sınırlarını "atlamadan" dolayı durum daha karmaşıktır.
31 Ocak'a bir ay eklenmesi gerektiğinde, algoritma takvimde "bir sonraki 31. günü" aramaz. Ay indeksini bir artırır ve Şubat'ta 31. günün olup olmadığını kontrol eder. Şubat'ta maksimum 28 veya 29 gün olduğundan, bir çelişki ortaya çıkar.
Böyle durumlarda hesaplayıcı "kısaltma" yöntemini kullanır. Sistem 28 (veya 29) Şubat'ı bitiş tarihi olarak belirler. Eğer algoritma 31 Ocak'a mekanik olarak 30 gün ekleseydi, sonuç 2 Mart olurdu ve bu da tam olarak takvim ayı ekleme mantığını bozardı.
Artık Yılların Hesaplanması
Tarihleri doğru bir şekilde sayısal formata ve geri dönüştürmek için, hesaplayıcının her yılın uzunluğunu tam olarak bilmesi gerekir. Algoritma yılı üç koşullu bir matematiksel filtreyle kontrol eder.
Öncelikle yıl dörde bölünebilirlik açısından kontrol edilir. Eğer yıl 4'e kalansız bölünmezse, hemen normal (365 gün) olarak kabul edilir. Eğer bölünürse, sistem ikinci koşula geçer ve 100'e bölünebilirliği kontrol eder. Artık yıl 100'e bölünmemelidir. Ancak burada üçüncü bir koşul vardır: eğer yıl 100'e bölünüyorsa, sadece 400'e de bölünüyorsa artık yıl olur.
Bu kontrol sayesinde hesaplayıcı, 2000 yılının artık yıl olduğunu, 1900 yılının ise olmadığını bilir. Bu bilgi, gün dönüştürme algoritmasında dikkate alınarak, herhangi bir tarihsel dönemde Şubat sınırlarını geçerken yüzde yüz doğruluk sağlanır.
Hafta Gününün Belirlenmesi
Günün sıra numarası tekrar takvime dönüştürülürken, hesaplayıcı hafta gününü de hesaplar. Günler kesin olarak birbirini takip ettiğinden ve hafta her zaman yedi günden oluştuğundan, sistem bölümden kalan alma işlemini (modül) kullanır.
İstenen tarihin sıra numarası 7'ye bölünür. Bu bölümden kalan, belirli bir hafta gününü gösterir. Eğer kalan sıfırsa, bu haftanın yedinci günüdür, bir ise birinci gün. Bu yöntem, tarihteki her tarih için büyük hafta günü tabloları saklama gereğini ortadan kaldırır.
İş Günü Hesaplaması
İş günlerini hesaplamak için hesaplayıcı filtreleme yöntemini uygular. Öncelikle tarihler arasındaki toplam takvim günü sayısı doğrusal model üzerinden hesaplanır. Ardından algoritma elde edilen her günü tarar ve modül bölmesiyle hafta gününü belirler.
Hafta sonuna düşen günler (kalanın belirli rakamları haftanın hangi gününden başladığına bağlıdır) toplam sayıdan çıkarılır. Tatilleri hesaba katarak hesaplama için bu işleme her iş gününün tatil tarihleri veritabanıyla kontrol edilmesi eklenir. Eğer tarih veritabanındaki bir tatille eşleşirse, o da nihai sonuçtan çıkarılır.
Doğruluk Mimarisi
Tarih hesaplayıcıları katı bir matematiksel mantığa dayanır. Takvimin sürekli bir sayı dizisine dönüştürülmesi, ana sorunu – ayların ve artık yılların düzensizliğini – çözer. Doğrusal model, bölünebilirlik kontrolü ve ay sınırlarını geçerken kısaltma algoritmaları sayesinde, sistem hataları ortadan kaldırır. Modüler aritmetik, ağır veritabanları olmadan hafta günlerinin belirlenmesini sağlar. Sonuç olarak kullanıcı, görevin karmaşıklığına bakılmaksızın doğru bir sonuç alır.
Yukarıda açıklanan tarihlerin doğrusal dönüştürülmesi kavramı, algoritmaların özünü anlamayı sağlayan temel bir mantıktır. Ancak pratikte modern web araçları daha da büyük bir doğrulukla çalışır. Bu tür uygulamaların (projemiz dahil) yapısında, tarih ve saat hesaplamasının günlerle değil, milisaniyelerle yapıldığı JavaScript kullanılır.