C# programlama dili eğitim serimizde, uygulamalarımızın gerçek dünyayla olan bağını kuran çok önemli bir konuya, Tarih ve Zaman İşlemlerine geldik. Hangi türde bir yazılım geliştiriyor olursanız olun (web sitesi, mobil uygulama, masaüstü programı veya oyun), tarih ve zaman verileriyle mutlaka karşılaşacaksınız.
Örneğin, bir kullanıcının yaşını hesaplamak, bir faturanın son ödeme tarihine kaç gün kaldığını bulmak veya bir veritabanı kaydının ne zaman oluşturulduğunu sisteme (log) yazdırmak için C# dilinin bize sunduğu DateTime (TarihZaman) yapısını kullanırız.
Bu rehberimizde, C# dilinde DateTime nesnesinin ne olduğunu, o anki zamanı nasıl alacağımızı, tarihler arasında nasıl matematiksel hesaplamalar (fark bulma, gün ekleme vb.) yapacağımızı ve bu tarihleri kullanıcıya nasıl estetik bir şekilde göstereceğimizi bol örneklerle öğreneceğiz.
1. DateTime Nedir ve Temel Kullanımı
C# dilinde tarih ve saat verilerini tutmak ve bu veriler üzerinde işlem yapmak için System kütüphanesi (namespace) içerisinde yer alan DateTime yapısı (struct) kullanılır.
O Anki Tarih ve Saati Almak
Bir programda en çok ihtiyaç duyulan şey, kodun çalıştığı o anki zamanı bilgisayardan almaktır. Bunun için DateTime.Now özelliğini kullanırız. Bu özellik, bilgisayarınızın bulunduğu yerel saat dilimine göre güncel tarihi ve saati verir.
// O anki güncel tarih ve saati alıyoruz
DateTime suAn = DateTime.Now;
// Sadece o anki tarihi (saat 00:00:00 olacak şekilde) almak için:
DateTime bugun = DateTime.Today;
// Dolar işareti ($) ile String Interpolation kullanarak ekrana yazdırıyoruz
Console.WriteLine($"Şu anki tam zaman: {suAn}");
Console.WriteLine($"Bugünün tarihi: {bugun}");
Neden UTC (Evrensel Zaman) Kullanmalıyız?
Eğer sadece Türkiye’de çalışacak bir program yazıyorsanız DateTime.Now işinizi görür. Ancak uygulamanız tüm dünyadan kullanıcılara hitap ediyorsa (örneğin bir web sitesi veya bulut tabanlı bir sistem), yerel saatler kullanıcıların bulunduğu ülkeye göre değişeceği için büyük bir kafa karışıklığı yaratır.
Modern yazılım mühendisliğinde, veritabanına tarih kaydedilirken her zaman UTC (Eşgüdümlü Evrensel Zaman) kullanılması tavsiye edilir. UTC, İngiltere’deki başlangıç meridyeni saatidir ve dünyanın her yerinde aynıdır.
DateTime evrenselZaman = DateTime.UtcNow;
Console.WriteLine($"Dünya genelindeki standart (UTC) saat: {evrenselZaman}");
2. Kendi Tarihimizi Oluşturmak ve Metinleri Tarihe Çevirmek
Sadece o anki zamanı değil, geçmiş veya gelecekteki spesifik bir tarihi de manuel olarak oluşturabiliriz.
Constructor (Yapıcı Metot) ile Tarih Oluşturmak: new DateTime(Yıl, Ay, Gün) şeklinde bir tanımlama yaparak kendi özel tarihimizi yaratabiliriz.
// 29 Ekim 2026 tarihini oluşturuyoruz
DateTime cumhuriyetBayrami = new DateTime(2026, 10, 29);
// İstersek saati de ekleyebiliriz (Yıl, Ay, Gün, Saat, Dakika, Saniye)
DateTime ozelAn = new DateTime(2026, 10, 29, 14, 30, 0);
Metinleri (String) Tarihe Dönüştürmek (Parsing): Dış dünyadan (örneğin bir web formundan veya bir dosyadan) gelen veriler genelde metin (string) formatındadır. Bu metinleri C# dilinin anlayacağı bir DateTime nesnesine çevirmemiz gerekir. Bunun için DateTime.Parse metodunu kullanırız. Özellikle uluslararası ISO 8601 formatındaki bir metni ayrıştırıp evrensel saate (ToUniversalTime()) çevirmek oldukça yaygın bir kullanımdır.
string girilenTarih = "2026-01-28T20:54:00Z";
// Metni okuyup DateTime nesnesine çeviriyoruz ve Evrensel Saate dönüştürüyoruz
DateTime islenecekTarih = DateTime.Parse(girilenTarih).ToUniversalTime();
Console.WriteLine($"Ayrıştırılan Tarih: {islenecekTarih}");
3. Tarih ve Zaman Değerlerini Parçalamak
Bazen elimizdeki devasa tarih bilgisinin sadece belirli bir kısmına (sadece yılına veya ayına) ihtiyaç duyarız. DateTime nesnesi bunun için bize harika alt özellikler (properties) sunar.
DateTime suAn = DateTime.Now;
int yil = suAn.Year; // 2026
int ay = suAn.Month; // Ayı sayısal olarak verir (Örn: 4)
int gun = suAn.Day; // Günü sayısal olarak verir (Örn: 15)
int saat = suAn.Hour; // 0-23 arası saat formatı
int dakika = suAn.Minute; // 0-59 arası dakika
DayOfWeek haftaninGunu = suAn.DayOfWeek; // Haftanın hangi günü olduğunu İngilizce verir (Örn: Monday)
Console.WriteLine($"Bulunduğumuz Yıl: {yil}, Ay: {ay}");
4. Tarih ve Zaman Üzerinde Matematiksel İşlemler
C# dilinde tarihler üzerinde tıpkı sayılar gibi matematiksel eklemeler ve çıkarmalar yapabiliriz.
Tarihe Zaman Eklemek ve Çıkarmak: Bir ürünün kargoya verilme süresini 3 gün sonrası olarak hesaplamak istiyorsak .AddDays() metodunu kullanırız. Geçmişe gitmek için ise parantez içine eksi (-) değer yazarız.
DateTime siparisTarihi = DateTime.Now;
// 3 gün sonrası
DateTime teslimatTarihi = siparisTarihi.AddDays(3);
// 2 ay sonrası
DateTime garantiBitis = siparisTarihi.AddMonths(2);
// 5 saat öncesi
DateTime gecmisZaman = siparisTarihi.AddHours(-5);
Console.WriteLine($"Sipariş: {siparisTarihi}");
Console.WriteLine($"Teslimat: {teslimatTarihi}");
İki Tarih Arasındaki Farkı Bulmak (TimeSpan): En kritik konulardan biri de iki tarih arasındaki farkı hesaplamaktır. Bir DateTime nesnesinden diğerini çıkardığınızda, C# size yeni bir DateTime nesnesi DEĞİL, bir zaman aralığını temsil eden TimeSpan adında yepyeni bir veri tipi döndürür.
DateTime dogumGunu = new DateTime(1995, 5, 20);
DateTime bugun = DateTime.Today;
// İki tarih birbirinden çıkarıldığında sonuç TimeSpan (Zaman Aralığı) olur
TimeSpan yasananSure = bugun - dogumGunu;
// Toplam yaşanan günü ekrana yazdıralım
Console.WriteLine($"Dünyada {yasananSure.TotalDays} gündür yaşıyorsunuz!");
5. Tarih ve Zamanı Kullanıcıya Şekilli Göstermek (Formatting)
Bilgisayarın arka planda 2026-05-15 14:30:22 olarak tuttuğu tarihi, son kullanıcıya (müşteriye) “15 Mayıs 2026” veya “15/05/2026” gibi çok daha estetik bir yapıda göstermek isteyebiliriz.
Bunun için .ToString() metodunun içine özel format harfleri yazarız:
d: Gün (1, 2, 15)dd: Çift haneli gün (01, 02, 15)MM: Çift haneli ay (01, 12)yyyy: 4 haneli yıl (2026)HH: 24 saat dilimine göre çift haneli saat (14, 21)mm: Dakikass: Saniye
DateTime simdi = DateTime.Now;
Console.WriteLine(simdi.ToString("dd.MM.yyyy")); // Çıktı: 15.04.2026
Console.WriteLine(simdi.ToString("dd/MM/yyyy HH:mm:ss")); // Çıktı: 15/04/2026 14:30:00
Console.WriteLine(simdi.ToString("yyyy-MM-dd")); // Çıktı: 2026-04-15 (Veritabanı standartı)
6. Öğrendiklerimizi Birleştirelim: Geri Sayım Uygulaması
Şimdi yukarıda öğrendiğimiz tarih oluşturma, matematiksel fark bulma (TimeSpan) ve formatlama yeteneklerini kullanarak gerçek bir Console uygulaması senaryosu yazalım. Bu program, yeni yılın gelmesine kaç gün ve saat kaldığını hesaplasın.
// 1. Hedef tarihi (Gelecek yılın ilk günü) oluşturuyoruz
int gelecekYil = DateTime.Now.Year + 1;
DateTime yeniYil = new DateTime(gelecekYil, 1, 1);
// 2. Şu anki zamanı alıyoruz
DateTime simdikiZaman = DateTime.Now;
// 3. Farkı hesaplıyoruz (TimeSpan)
TimeSpan kalanZaman = yeniYil - simdikiZaman;
// 4. Sonuçları estetik bir şekilde kullanıcıya sunuyoruz
// Console ekranlarında platform bağımsız alt satıra geçmek için Environment.NewLine kullanabiliriz
Console.WriteLine($"--- YENİ YIL GERİ SAYIM ARACI ---{Environment.NewLine}");
Console.WriteLine($"Hedef Tarih: {yeniYil.ToString("dd.MM.yyyy")}");
Console.WriteLine($"Kalan Süre: {kalanZaman.Days} gün, {kalanZaman.Hours} saat, {kalanZaman.Minutes} dakika kaldı!");
Console.WriteLine($"{Environment.NewLine}Çıkmak için bir tuşa basınız...");
Console.ReadLine();
Sonuç
Bu rehberimizde, C# programlamanın en sık başvurulan kütüphanelerinden biri olan DateTime yapısını detaylarıyla öğrendiniz. Uygulamalarınızda güvenli log kayıtları tutmak için evrensel saati (UTC), kullanıcı deneyimini artırmak için formatlanmış yerel saati, süre ölçümleri yapmak için ise TimeSpan mimarisini kullanmalısınız. Tarih ve zaman verilerini doğru yönetmek, veritabanı hatalarını önleyen ve uluslararası standartlara uyan profesyonel yazılımlar geliştirmenin en temel anahtarıdır. Bir sonraki dersimizde bu verileri nasıl kalıcı bir şekilde dosyalara (File I/O) kaydedeceğimizi öğreneceğiz. İyi kodlamalar dileriz!




