Furkan KapukayaYazılım geliştirme
Dijital Temeller2 dk okuma

Yazılımda Tarih, Saat ve Zaman Dilimi: UTC Neden Önemli?

Tarih ve saati saklarken UTC kullanmanın önemi, Türkiye saatinin (UTC+3) özellikleri, yaz saati, tarih formatları, ISO 8601 ve .NET'te DateTime, DateTimeOffset ve TimeProvider kullanımı.

"Rapor bir gün eksik gösteriyor", "randevu üç saat kaymış", "gece yarısı çalışan görev iki kez tetiklendi"... Tarih ve saat, yazılımda en çok hafife alınan ve en sinsi hatalara yol açan konulardandır. İyi haber şu: birkaç basit kural bu hataların neredeyse tamamını önler.

Altın kural: Saklarken UTC, gösterirken yerel saat

UTC (Eş Güdümlü Evrensel Zaman), zaman dilimlerinin referans noktasıdır ve yaz-kış saati uygulamasından etkilenmez.

  1. Veritabanına ve loglara zamanı UTC olarak yazın.
  2. Kullanıcıya gösterirken onun zaman dilimine çevirin.
  3. Mümkünse zamanla birlikte farkı (offset) da saklayın.

Böylece sunucunuz başka bir ülkeye taşınsa, bulut sağlayıcınız farklı bir saat diliminde çalışsa veya müşteriniz yurt dışında olsa da veriler tutarlı kalır.

Türkiye saati hakkında bilinmesi gerekenler

Türkiye 2016'dan bu yana kalıcı olarak UTC+3 kullanıyor ve yaz saati uygulaması yapmıyor. Ancak:

  • Eski tarihli kayıtlar (2016 öncesi) farklı farklara sahip olabilir.
  • Avrupa ile çalışıyorsanız aradaki fark yılda iki kez değişir.
  • Sunucu işletim sisteminin zaman dilimi veritabanı güncel tutulmalıdır.

Tarih formatları: ISO 8601

"03/04/2026" bir ülkede 3 Nisan, başka bir ülkede 4 Mart demektir. Sistemler arası veri alışverişinde her zaman ISO 8601 formatını kullanın:

2026-10-05T14:30:00+03:00
2026-10-05T11:30:00Z      (Z = UTC)

Kullanıcıya gösterirken ise Türkçe biçim ("5 Ekim 2026, 14:30") tercih edilir.

.NET'te doğru tipler

// Bir anı kesin olarak ifade eder (fark bilgisiyle)
DateTimeOffset simdi = DateTimeOffset.UtcNow;

// Saat bilgisi gerekmeyen tarihler için (doğum tarihi gibi)
DateOnly dogum = new DateOnly(1995, 4, 12);

// Test edilebilir zaman: doğrudan DateTime.Now yerine
public class FaturaServisi(TimeProvider zaman)
{
    public bool VadesiGectiMi(DateTimeOffset vade) => zaman.GetUtcNow() > vade;
}

TimeProvider sayesinde testlerde zamanı "dondurabilir", vade ve süre hesaplarını güvenle doğrulayabilirsiniz. Test yazımına giriş için xUnit ile birim testi yazısına bakabilirsiniz.

Sık yapılan hatalar

  • DateTime.Now ile sunucunun yerel saatine güvenmek
  • "Gün sonu" raporlarında UTC ile yerel gün sınırlarını karıştırmak
  • Doğum tarihi gibi saat içermeyen bilgileri saat diliminden etkilenen tiplerle saklamak
  • Zamanlanmış görevlerde sunucu saatini varsaymak

Sık sorulan sorular

Veritabanında hangi alan türünü kullanmalıyım?

SQL Server'da datetimeoffset veya UTC değeri tutan datetime2, PostgreSQL'de timestamptz iyi tercihlerdir.

Kullanıcının zaman dilimini nasıl bilirim?

Web uygulamalarında tarayıcıdan alınabilir; kurumsal uygulamalarda kullanıcı ayarlarında saklanması en güvenilir yoldur.

Sonuç

Zamanı UTC olarak saklamak, standart format kullanmak ve doğru tipleri seçmek; raporlarınızın, randevularınızın ve otomasyonlarınızın güvenilir çalışmasının temelidir.