Makale Özeti

DateTime tipinin metotları ve özelliklerini inceleyerek bu tipi daha etkin nasıl kullanabileceğimizi inceleyeceğiz. Bu makalede belki de DateTime tipiyle ilgili olarak hiç bilmediğiniz birkaç ipucuna da erişebileceksiniz.

Makale

DateTime yapısı(struct) gerek web, gerekse masaüstü uygulamalarımızda en sık kullandığımız tiplerden birisidir. Tarihsel bilgi depolayan bu tipin temel kullanım amacı tarih bilgilerini saklamak ve tarihi yazdırmaktır. Kendi belirteceğimiz değerleri saklayabilirken, veritabanı, XML dosyaları gibi veri kaynaklarında saklanan tarihsel değerleri de çeşitli dönüştürme işlemleri sonucunda bünyesinde saklayabilir. Bu nedende birçok uygulamada bu tip değerlerin farklı kullanım şekillerine ihtiyaç duyulabilmektedir. Örneğin bir günün yılın kaçıncı günü olduğu, bir ayda kaç gün olduğu, zamanın bileşenlerini istediğimiz sırada yazdırmak (gün-ay-yıl veya gün-ay-saat-dakika... gibi) ya da iki tarih arasındaki farkı bulmak gibi işlemleri pratik şekilde gerçekleştirmek eminim ki çoğu zaman ihtiyacımız olacaktır. İşte bu makalede DateTime tipinin bu tip işlevsellikleri nasıl yerine getirebileceğini inceleyeceğiz.

Bu tip işlevsellikleri yerine getirmek için aslında çok da uzaklara gitmeye gerek yok. Zira DateTime tipinin kendi üyeleri burada bahsettiğimiz işlemleri zaten yapabilecektir. Peki o zaman lafı çok da uzatmadan yavaş yavaş bu ince detayları incelemeye başlayalım.


DateTime Tipinin Statik Metotları ve Özellikleri(Properties)

Statik olan metot ve özellikler aracılığıyla zaman ile ilgili bazı temel işlemler gerçekleştirilebilir. Örneğin sıklıkla kullandığımız DateTime.Now özelliği çalıştırıldığı andaki sistem tarihini tüm detaylarıyla DateTime tipinden üretecektir. Aşağıdaki listede bazı statik üyeler ve ne gibi görevleri olduğu görüntülenmiştir.

Üye İşlevi
Now Çalıştırıldığı andaki zaman değerini DateTime tipinden getirir.
UtcNow Çalıştırıldığı andaki zamanın UTC(evrensel zaman) değerini DateTime tipinden getirir.
Compare(DateTime t1, DateTime t2) t1 ve t2 gibi DateTime tipinden iki değeri karşılaştırarak hangi değerin daha büyük olduğunu getirir. Geri dönüş değeri int olan bu metot eğer t1  büyük ise 1, t2 büyük ise -1, iki tarih birbirine eşit ise 0 değerini getirir.
DaysInMonth(int year, int month) Belirtilen bir yılın ayının kaç gün olduğunu getirir.
IsLeapYear(int year) Belirtilen yılın artık yıl olup olmadığını boolean tipinden getirir.
Parse() string tipindeki bir değerin DateTime tipine çevrilmesini sağlar.

Aşağıda bu üyelerden bazılarının kullanımına örnekler görülmektedir.

// Compare metodu

DateTime ahmet = new DateTime(1997, 12, 21);

DateTime ayse = new DateTime(1998, 1, 25);

Console.WriteLine("Karşılaştırma sonucu: " + DateTime.Compare(ahmet, ayse));

 

//IsLeapYear metodu

if(DateTime.IsLeapYear(2008))

    Console.WriteLine("2008 yılı 366 gündür");

 

//DaysInMonth metodu

int yil = 2008, ay = 2;

Console.WriteLine("{0} yılının {1}. ayı {2} gündür", yil, ay, DateTime.DaysInMonth(yil, ay));

 

//Parse metodu

string zaman = "14.4.2008 21:52";

DateTime d = DateTime.Parse(zaman);

Console.WriteLine("DateTime değişkeninin değeri: " + d.ToString());


Resim: Kodların konsol ekranındaki çıktısı


DateTime Tipinden Bir Değişkenin Metotları ve Özellikleri(Properties)

DateTime tipindeki bir değişken üzerinde gerçekleştirebileceğimiz işlemler aslında makalenin bundan sonraki kısmını teşkil ediyor. Tarihsel bir veri ile ilgili aklımıza gelecek aritmetik işlemler, formatlamalar ve okuma işlemleri değişkenin üyeleri vasıtasıyla yapılabilir. Aşağıdaki listede DateTime değişkeni üzerinden kullanabileceğimizi bazı özellikler ve işlevleri yer almaktadır.

Üye İşlevi
DayOfWeek Haftanın kaçıncı günü olduğunu getirir.
DayOfYear Yılın kaçıncı günü olduğunu getirir.
Day Gün değerini getirir.
Hour Saat değerini getirir.
Month Ay değerini getirir.
Minute Dakika değerini getirir.
Second Saniye değerini getirir.
Year Yıl değerini getirir.

Tabi ki DateTime tipine ait olan üyeler yukarıdaki listeden ibaret değil. Asıl önemli olacak ve sıklıkla kullanabileceğimiz üyeler ve bu üyelerin kullanımlarını aşağıdaki başlıklarda detaylı şekilde görebilirsiniz.


DateTime Değerleri String'e Çevirme ve Formatlama İşlemleri

Verinin sunuluş şekli bizler için bazı durumlarda sorun olabilmektedir. Elimizdeki değer eğer metne dönüştürülebilen bir değer ise istediğimiz kısmını sunmak için normal şartlarda string sınıfının metotlarını kullanırız. Fakat DateTime tipindeki bir değerin belirli parçalarını elde etmek için hali hazırda gelmiş bazı metotlar bulunmaktadır. Bu metotlar zamanın sadece tarih kısmını veya sadece saat kısmını getirebilmektedir. ToString() metodu zaman ile ilgili tüm bilgileri getirirken, ToLong... ile başlayan metotlar sadece tarih veya saatin uzunca yazılmış, ToShort... ile başlayan metotlar da sadece tarih veya saatin kısaca yazılmış halini getirir. Aşağıdaki kod parçalarında bu metotların kullanımları, resimde de çıktılarının nasıl olacağı görülmektedir.

DateTime zaman = DateTime.Now;

Console.WriteLine("ToString()\t\t" + zaman.ToString());

Console.WriteLine("ToLongDateString()\t" + zaman.ToLongDateString());

Console.WriteLine("ToLongTimeString()\t" + zaman.ToLongTimeString());

Console.WriteLine("ToShortDateString()\t" + zaman.ToShortDateString());

Console.WriteLine("ToShortTimeString()\t" + zaman.ToShortTimeString());


Resim: String dönüşüm metotlarının ekran çıktıları

Yukarıdaki metotlar temel olarak zamanın belirli kısımlarını kısa veya uzun formatta getirdiği için yeterli olabilir. Fakat bazı durumlarda zaman değerinin her türlü ayrıntısına müdahale etmek ve istediğimiz bilgilerin istediğimiz sırada gelmesini isteyebiliriz. Örneğin sadece gün ve ay bilgisine ihtiyacımız olabilir. Ya da gün, ay, saat ve dakika bilgilerine... Böyle durumlarda ise DateTime tipinin ToString metodunun formatlanabilir hali işimizi görmektedir. Yapmamız gereken işlem belirli standartları olan harfler dizesini ToString metoduna parametre olarak vermek ve sonucunu kullanmak. Burada kullanacağımız belirli karakterlerin bir anlamı olacak, hatta bir karakterin farklı yazım şekilleri farklı sonuçlar verebilecektir. Aşağıdaki tabloda temel olarak ihtiyaç olabilecek karakter kullanımlarını açıklamaya çalıştım:

Karakter(ler) İşlevi
F Zamanı yazar. Ay ve gün bilgilerini metinsel getirilir.
f Zamanı sadece saati kısa olacak şekilde yazar. Ay bilgisi metinsel getirilir.
m Sadece günü ve ayı getirir
t Sadece saati ve dakikayı getirir.
y Sadece ayı ve yılı getirir.
d Günün rakamsal değerini getirir. Eğer 03 ise 0 değerini getirmez.
dd Günün rakamsal değerini getirir.
dddd Günün metinsel değerini getirir. Ör. Salı.
M Ayın rakamsal değerini getirir. Eğer 01 ise 0 değerini getirmez.
MM Ayın rakamsal değerini getirir.
MMMM Ayın metinsel değerini getirir. Ör. Ocak h Saati getirir. Eğer saat 02 ise sadece 0 değerini getirmez.
yy Yılın son iki rakamını getirir. Ör. 2009 yılı için 09.
yyyy Yıl değerini getirir.
H Saat değerini getirir. Eğer 01 gibi bir değer ise 0 değerini getirmez.
HH Saat değerini getirir.
mm Dakika değerini getirir.
tt 12'li saat sistemlerinde kullanılan AM ve PM değerlerini getirir.
ss Saniye değerini getirir.

Yukarıdaki karakter ve karakter grupları aralarında istenilen diğer karakterlerle beraber kullanılarak istenilen formatta çıktı elde edilebilir. Örneğin saat ile dakika arasına : karakterinin getirilerek yazılması isteniliyorsa hh:mm şeklindeki bir ifade bu görevi yerine getirecektir. Aşağıdaki farklı kod parçaları ve bu kodların çıktılarında karakterlerin kullanımına örnekler görülmektedir.

DateTime zaman = DateTime.Now;

Console.WriteLine(zaman.ToString("dd-MM-yyyy"));        // 08-01-2009

Console.WriteLine(zaman.ToString("dd.MM.yyyy HH:mm"));  // 08.01.2009 23:05

Console.WriteLine(zaman.ToString("d MMMM dddd"));       // 8 Ocak Perşembe


Resim: Formatlama karakterleri kullanılarak elde edilen sonuçlar

Zamanın, saatin kısa-uzun değerlerinin alınması, belirli değerlerin istenilen sırada ve karakterlerle alınması işlemlerini yukarıda inceledik. Tarihsel değerlerle ilgili olarak ihtiyacımız olabilecek bir diğer formatlama şeklide kültür bilgisine göre; yani dile göre tarihsel bilgileri elde etmek olabilir. Belirli bir dile göre ayın ve günün metinsel farklılığı, gün ve ay sıralaması ile saat değerinin AM, PM değerleriyle veya 0-24 arasındaki değerlerle yazılması farklılık gösterebilir. Bu tip formatlama işlemlerinde yine ToString metodunun bir başka aşırı yüklenmiş(overloaded) hali kullanılabilir. Bu aşırı yüklenmiş metot string bir değer ile IFormatProvider arayüzünü(interface) uygulamış bir nesneyle -ki bu nesne CultureInfo tipinden olacaktır- çalışacaktır. CultureInfo tipi ise kültür bilgisini alan bir yapıcı metot alarak kullanılabilir. Buradaki kültür bilgisi çoğumuzunda bildiği tr-TR, en-US gibi dil değerini taşıyan standart karakter gruplarıdır. Aşağıda Türkçe, İngilizce ve Almanca dillerindeki tarih bilgilerini getiren kodlar yer almaktadır.

DateTime zaman = DateTime.Now;

Console.WriteLine("tr-TR: " + zaman.ToString("F", new System.Globalization.CultureInfo("tr-TR")));

Console.WriteLine("en-US: " + zaman.ToString("F", new System.Globalization.CultureInfo("en-US")));

Console.WriteLine("de-DE: " + zaman.ToString("F", new System.Globalization.CultureInfo("de-DE")));


Resim: Kültür bilgilerine göre dil bilgisine göre formatlanmış tarih bilgileri


Tarihsel Değer Üzerine Ekleme ve Çıkarma İşlemleri

Belirli bir tarihin üzerinde ekleme ve çıkarma işlemi yaparak yeni bir tarih değeri elde etme işlemine yine bazı durumlarda ihtiyacımız olabilir. Bu tip durumlarda DateTime tipinden bir değişkene ait Add... ile başlayan metotlar işimizi görecektir. Bir tarihsel değere saat, gün, ay... vb. değerler eklenilmesini herbir birim için ayrı olan metotları kullanarak gerçekleştirebiliriz. Örneğin tarihsel bir değere dakika eklemek veya çıkarmak için AddMinutes, AddDays gibi metotlar kullanılabilir. Rakamsal değerler alan bu metotlar değişken içerisindeki tarihe o kadar değer ekleyerek yeni DateTime tipindeki değeri döndürecektir. Bu arada DateTime tipinde Remove... ile başlayan metotlar yoktur, ama Add... metotlarına eksi değerler verilerek çıkarma işlemi de yapılabilir.

DateTime zaman = DateTime.Now;

Console.WriteLine("20 dakika öncesi:" + zaman.AddMinutes(-20));

Console.WriteLine("7 saat sonrası:" + zaman.AddHours(7));

Console.WriteLine("25 gün sonrası: " + zaman.AddDays(25));

Console.WriteLine("3 gün 5 saat 30 dakika sonrası: " + zaman.Add(new TimeSpan(3, 5, 0,0)));


Resim: Zamana dakika, saat, gün gibi değerlerin eklenmesi-çıkarılması işlemleri

Not: Son işlemdeki TimeSpan tipi zaman aralığı oluşturma işlemlerinde kullanılır. DateTime tipi gibi saniye, dakika, saat, gün, ay, yıl gibi değerleri taşır.


İki Tarih Arasındaki Farkı Bulma

İki tarih arasındaki değeri bulmak işlemi için yine TimeSpan tipinden bir değer kullanılabilir. Tarihsel değerler veritabanlarında sıklıkla kullanıldığı için bir kaydın veritabanına ne kadar süre önce eklendiği veya iki farklı kayıt arasındaki zaman farkını bulmak işlemleri günlük uygulamalarda sıklıkla karşımıza çıkabilen durumlardır. İki tane DateTime tipinden değişkenin birbirinden çıkarılması sonucunda oluşan değer TimeSpan tipindeki bir değişkende saklanabilir. Yani iki tane DateTime tipinden değişkene - operatörünün uygulanması sonucunda oluşan değer .NET Framework'te TimeSpan tipindendir. Bu değişken vasıtasıyla da aradaki saat, gün gibi değerlerden fark bulunabilir. TimeSpan tipindeki değişkenin TotalHours, TotalMinutes, TotalDays... gibi özellikleri(property) veya ToString metodu aracılığıyla tarih farkı değerleri okunabilir. Aşağıdaki kod parçasında iki DateTime tipindeki değerin TimeSpan tipindeki değişkene nasıl atandığı ve aradaki fark değerinin nasıl okunduğu görülmektedir.

DateTime zaman = DateTime.Now.AddHours(-3);

TimeSpan aralik = DateTime.Now - zaman;

Console.WriteLine(aralik.ToString());

Console.WriteLine("İki tarih arasındaki saat farkı: " + aralik.TotalHours);


Resim: İki tarih arasındaki değerin bulunması

Bu makalemizde uygulamalarımızda sık kullandığımız DateTime tipini derinlemesine incelemeye çalıştık. Belki de şimdiye kadar keşfetme şansını bulamadığınız işlemlerin nasıl yapılabildiğini bu yazıda okuma şansı bulmuşsunuzdur. Bir başka makalede görüşmek dileğiyle...


Uğur UMUTLUOĞLU
www.umutluoglu.com
www.nedirtv.com