..::Tarih ve saat hesaplamaları::..

Cansiz

New member
Gündelik yaşamımızda kullandığımız gerek takvim sistemi gerekse zaman sistemi gerçekten bir çok karılışlığa yol açacak biçimde profesyoneller tarafından hazırlanmış sanki. Her senenin artık yılı Şubat'ın 4 yılda bir 29 çekmesi her bahar takviminde saatlerin 1 saat ileri/geri alınması ve benzeri bir çok problem var. Ama asıl problem rakamların döngü aralıklarının farklı olmasında. Her 60 saniyede 1 dakikanın, her 60 dakikada 1 saatin her 24 saatte bir gün olması problemi yetmezmiş gibi bazı aylar 30 bazıları 31 bazıları da 4 yılda bir 29 gün çekiyor. İşin moral verici kısmı hepsinin katı şartlara bağlı olması.

Tarih ile başlayalım. Saate göre hesaplaması daha zor demek gayet mümkün. Tarih hesaplamadaki başlıca 3 yöntemi ele alalım.

1. Örneksel tarih hesaplama
Bu yöntemde tarih direkt bir string olarak işlem görür. Hesaplanabilmesi için muhakkak ay, gün ve yıl olarak rakamsal biçime çevrilip kontrol edilmesi gerekir. Eğer yapılan işlemlerde insan eli değiyorsa hata çıkartma olasılığı çok yüksektir. Ayrıca fazladan hafıza alanı kaplarlar. Fakat programlama anında deneme ve log dosyaları oluşturmak için en iyi yöntem budur.
Örneğin 25/12/2005

2. Sınırlı aralıklı hesaplama
Tarih bilgisi gün, ay ve yıl olarak bitlere bölünerek hesaplanır. Bu biçimde aynı zamanda opsiyonel olarak saatte saklanır. 2 Byte tarih ve 2 Byte saat bilgisini içerir. Bu yönteme tipik örnek olarak, FAT sistemini verebiliriz. Bu yöntem ile 1980 öncesi veya 2107 yılları sonrası yazılamaz. Zaten o yıla kadar yaşamayız dediğinizi duyar gibiyim ama bir tarih kitabı yazıyorsanız yaşamış olmanız gerekmez

Bitler – Belirttiği zaman
15..11 - Saat (0..23)
10..5 - Dakika (0..59)
4..0 – Saniye / 2 (0..29)

5..9 - Yıl (0 = 1980, 127 = 2107)
8..5 - Ay (1 = Ocak, 12 = Aralık)
4..0 - Gün (1..31)

3. Tarih ve Saati indis ile hesaplama
En ideal yöntemdir. Tarih veya Saat opsiyonel olarak ayrı ayrıda kullanılabilir. Tarih en küçük birim olan gün sayısı cinsinden yazılır. Kullanması biraz zahmet verici olsada bir çok hazır prosedur ve fonksiyon ile tarih ve saat üzerine bir çok işlem yapmanıza olanak sağlayacaktır. Taban tarih olarak 30.12.1899 saat 12.00am olarak alınır. Yani 0 rakamı bu tarihi ifade eder. Buna göre 1, bir gün sonrası 31.12.1899 saat 12.00am anlamına gelir. Bu tarih biçimi double değişken tipinde tanımlanır. Bilgiğimiz üzere dobule sayı tipi 8 byte, küsüratlı ve işaretli sayıları tutar. Bu şu anlama gelir, sayının tam kısmı günü ifade ederken ondalıklı kısmı ise saati ifade eder. (Saat biçiminde en küçük birim mili saniye olarak alınır)
Örneğin
20.12.1899 = -10
30.12.1899 = 0 (taban gün)
02.21.2006 = 38769
02.22.2006 = 38770
02.22.2006, 13:19:12 = 38770.555

(Tarih ve saat işlemleri ile ilgili bilgiyi konu sonunda görebilirsiniz)


Saat hesaplamaları Tarih hesaplamasına göre nisbeten daha kolaydır. Başlıca 3 yöntem

1. Örneksel saat hesaplama
Bu hesaplama türünde her saate karşılık gelen rakam 100 lük sayı biçimine çevirilerek saatin yüzdesi alınmış olur. Taban birim olarak dakika kullanılır. Bir dakika yaklaşık olarak 1.66 dır. İşlemler saatler ve dakikalar için ayrı ayrı yapılır ve sonuç dakika cinsinden öğrenilmek isternirse geri bölme yapılır.

Örneğin
16:40:00 ≈ 16.66 (40 x 1.66 = 66)
23:00:00 = 23.00 (0 x 1.66 = 0)
11:15:00 ≈ 11.25 (15 x 1.66 = 24.9)

Çıkan rakamlara kendi aralarında toplama ve çıkartma işlemi yapılabilir. Örnekteki rakamları toplarsak
16.66
23.00
11.25
______
50.91 buluruz.

Burada hassas bir nokta sonucun yüzdelik saat olmasıdır. Eldeki bu veri direkt bir matematik işlemi ile kullanılabilir. Sayı yakın oldugu rakama 2 basamak olacak şekilde yuvarlanır.

Örneğin 50.91 x 5YTL = 254.55 YTL

Sonuç geri dakika cinsinden bulunmak istenirse saat normal yazılır, noktadan sonraki kısım tekrar 1.66 ya bölünür.

91 / 1.66 ≈ 55 ıse 50 saatin yanina 55 dakika eklenir = 50.55

2. Saati birim zamana çevirerek hesaplamak
Zaman sisteminde ölçülebilirlik göz önüne alınarak optimum zaman birimi belirlenir. Genelde dakika yeterli olsada zaman birimi kısaltılarak saniyenin milyarda biri bile baz alınabilir. Mukemmel ölçü en kısa olanı olsa da gündelik kullanım için saniyeden fazlasına gitmeye gerek yok. Eğer amacımız sadece zamanı hesaplamaksa tarih için kullandığımız indis ile hesaplamayı saat içinde kullanabiliriz. Yinede formul olarak açıklamak gerekirse sırasıyla saat dakikaya, dakika saniyeye varsa saniye de mili ve micron saniyeye çevirilerek en küçük zaman birimine indirgenir. Fakat özel bir amaç yoksa bu kadar zahmeti çekmek çok anlamsız olabilir.

Örnek (Birim=saniye)
16:40:15 => 16*3600 + 40*60 + 15 = 60015sn
60015 / 3600 = 16sa (küsuratlı kısım atılır)
(60015 mod 3600) / 60 = 40 (küsuratlı kısım atılır)
60015 mod 60 = 15 sn

3. Tarih ve Saati indis ile hesaplama (devamı)
Tarih ve saat işlemleri üzerinde yapılabilecek başlıca işlemler (Delphi için)

DateTimeToFileDate: Indis ile verilen zaman tipini işletim sisteminin zaman tipine dönüştürür
DateToStr: Tarihi görüntüler
TimeToStr: Saati görüntüler

DayOfTheMonth (DayOf): Ayın gününü görüntüler (1..31)
DayOfTheWeek: Haftanın gününü verir (1=Pazartesi – 7=Pazar)
DayOfTheYear: Yılın kaçıncı günü olduğunu verir (1=Ocak 1, 33=Şubat 3, 365=Aralık 31)

DaysInAMonth: Verilen yıl ve ayın kaç gün olduğu (2000 Şubat=29 çeker)
DaysInAYear: Verilen yılın kaç gün olduğu (2000=366 gün)

WeekOfTheYear (WeekOf): Yılın haftasını verir (360=52. hafta)
MonthOfTheYear (MonthOf): Yılın ayını döndürür
YearOf: Tarih bilgisindeki yılı döndürür

DecodeDate: Zaman indisini tarih bilgilerini dönderir.
DecodeTime: Zaman indisinin saat bilgilerini dönderir.
DecodeDateTime: Zaman indisinin tarih ve saat bilgilerini dönderir.

EncodeDate: Girilen tarih bilgisini zaman indisine dönderir.
EncodeTime: Girilen saat bilgisini zaman indisine dönderir.
EncodeDateTime: Girilen tarih ve saat bilgilerini zaman indisine dönderir.

IncDay: Tarihi belirtilen gün kadar ileri veya geri döndürür.
IncHour, IncMilliSecond, IncMinute, IncSecond, IncWeek, IncYear.

HourOf: Zaman bilgisi içinde sadece saati döndürür
MinuteOf: Zaman bilgisi içinde sadece dakikayı döndürür
SecondOf: Zaman bilgisi içinde sadece saniyeyi döndürür

Now: Sistemin güncel zamanı (tarih, saat)
Date: Sistemin güncel tarihi
Time: Sistemin güncel saati


Daha fazla kaynak için Delphi DateUtils’e bakabilirsiniz...
Alıntıdır!​
 

acrapole

New member
selam eline saglık.. ama ben tarihler arası listboxlardaki kutucuklarda kıyaslama yapmak istiyorum.tarih harici bir veri görürüse program susuyor. tarih degilse atla nasıl diyecegim
 

HTML

Üst