Unix Zaman Damgası mı ISO 8601 mi: Hangisini Kullanmalısın?

Unix zaman damgası ve ISO 8601 tarih formatını API ve veritabanı kullanımı için karşılaştıran geliştirici

İki farklı sistemin tarih formatlarını entegre etmeye çalıştıysan, bu acıyı zaten biliyorsun. Bir API 1714521600 döndürüyor, diğeri 2024-05-01T00:00:00Z ve sen gece yarısı dönüşüm kodu yazıyorsun. Baştan doğru kararı vermek, yani unix timestamp formatı ile ISO 8601 arasında bilinçli seçim yapmak, saatlerce debug sürecini ve production'da sinsi bug'ları önler. Her iki format da yaygın kullanılıyor, her ikisinin de gerçek avantajları var ve hiçbiri her durumda "daha iyi" değil. Önemli olan, hangisinin hangi duruma uyduğunu ve yanlış seçimin nasıl gerçek maliyetler yarattığını tam olarak anlamak.

Önemli Noktalar:

  • Unix timestamp'leri, 1 Ocak 1970 UTC'den bu yana geçen saniye (ya da milisaniye) sayısını tutan integer değerlerdir; matematiksel işlemler, depolama ve API'lar için idealdir.
  • ISO 8601, standartlaştırılmış, insan tarafından okunabilir bir string formatıdır; log'lar, kullanıcı arayüzleri ve sistemler arası veri alışverişi için uygundur.
  • Bu iki format birbirinin rakibi değil, tamamlayıcısıdır. Pek çok production sistemi dahili olarak Unix time depolar, dışarıya ise ISO 8601 formatında veri sunar.
  • Yanlış bağlamda yanlış format seçmek saat dilimi bug'larına, parse hatalarına ve gereksiz karmaşıklığa yol açar.

Unix Timestamp Formatı Nedir?

Unix timestamp (Unix time veya epoch time olarak da bilinir), Unix epoch'undan, yani 1 Ocak 1970 00:00:00 UTC'den bu yana geçen saniye sayısını temsil eden tek bir integer değerdir. Unix time formatı, tanımı gereği saat dilimine bağımsızdır; her zaman UTC'ye referans verir. Yaz saati uygulaması veya bölgesel ofsetler konusunda herhangi bir belirsizlik yoktur.

Örneğin, 1714521600 Unix timestamp'i, dünyada nerede okursan oku, tam olarak tek bir anı temsil eder. Modern sistemler genellikle bunu daha yüksek hassasiyet için milisaniye (1714521600000) ya da mikrosaniye düzeyine taşır. Bu varyasyonlar hakkında daha fazla bilgi için Unix timestamp'lerinde saniye, milisaniye ve mikrosaniye karşılaştırması rehberimize göz atabilirsin.

Teknik olarak Unix timestamp yalnızca bir sayıdır. Bu sadelik hem en büyük gücü hem de en temel okunabilirlik sorununun kaynağıdır.

Bu kavramın kökenlerine dair daha fazla bilgi için epoch time ve temelleri makalemizi inceleyebilirsin.

ISO 8601 Tarih Formatı Nedir?

ISO 8601, Uluslararası Standardizasyon Örgütü tarafından yayımlanan ve tarihlerin ile saatlerin string olarak nasıl temsil edileceğini tanımlayan uluslararası bir standarttır. Tipik bir ISO 8601 tarih-saat değeri şöyle görünür: 2024-05-01T00:00:00Z.

Bunu parçalara ayıralım:

  • 2024-05-01 - YYYY-MM-DD formatında tarih
  • T - tarih ile saat arasındaki ayraç
  • 00:00:00 - HH:MM:SS formatında saat
  • Z - UTC'yi belirtir (+05:30 gibi ofsetler de kullanılabilir)

ISO 8601, internet protokollerinde yaygın olarak kullanılan RFC 3339 standardının temelini oluşturur. İnsan tarafından okunabilir, string olarak sıralanabilir ve yerel ayardan bağımsız olarak tutarlıdır. "05/01/2024" yazmak ABD'de 1 Mayıs anlamına gelirken Avrupa'da 5 Ocak anlamına gelir; ISO 8601 ise küresel düzeyde tutarlıdır.

Temel Farklar

Özellik Unix Timestamp Formatı ISO 8601 Tarih Formatı
Veri tipi Integer (veya float) String
İnsan tarafından okunabilir Hayır Evet
Saat dilimi yönetimi Her zaman UTC (örtük) Açık ofset veya Z
Matematiksel işlemlere uygunluk Evet (çıkarma, karşılaştırma) Hayır (parse gerektirir)
Depolama boyutu Küçük (4-8 byte) Daha büyük (20+ karakter)
Doğrudan sıralanabilir Evet (sayısal sıralama) Evet (sözcüksel sıralama)
Yerel ayardan bağımsız Evet Evet

Unix Timestamp Formatı Ne Zaman Kullanılır?

Unix time formatı, belirli ve iyi tanımlanmış senaryolarda üstünlüğünü kanıtlar. Şu durumlarda tercih et:

1. Tarih Hesaplamaları Yaparken

Unix timestamp'leriyle süre hesaplamak son derece kolaydır; iki integer'ı birbirinden çıkarman yeterli. ISO 8601 string'leriyle aynı işlemi yapmak için önce her ikisini de datetime nesnesine parse etmen, ardından farkı hesaplaman gerekir. Yüksek frekanslı işlemlerde (milyonlarca event loglama gibi) bu parse maliyeti hızla birikerek fark yaratır.

2. Veritabanında Tarih Depolarken

Integer sütunlar, string sütunlara kıyasla daha hızlı indekslenir ve karşılaştırılır. "Son 7 gündeki tüm event'leri getir" gibi sorgularda iki integer'ı karşılaştırmak, string'leri parse edip karşılaştırmaktan çok daha verimlidir. Veritabanlarında Unix timestamp'leri rehberimiz, indeksleme stratejilerini ve sorgu kalıplarını ayrıntılı biçimde ele alıyor.

3. Dahili Servisler Arası İletişimde

Kontrolünde olan iki backend servisin timestamp alışverişi yapması gerektiğinde, Unix formatı parse karmaşıklığını ortadan kaldırır. Her iki taraf da integer sözleşmesi üzerinde anlaşır ve saat dilimi string'lerinin yanlış yorumlanma riski kalmaz.

4. Son Kullanma ve TTL Mantığında

JWT token'ları, önbellek girdileri ve oturum son kullanma tarihleri neredeyse evrensel olarak Unix timestamp olarak ifade edilir. Bir JSON Web Token (JWT)'daki exp claim'i tam da bu yüzden Unix timestamp'tir: exp > Date.now() / 1000 karşılaştırması tek bir hızlı integer işlemidir.

5. Saat Dilimi Bug'larından Kaçınmak İçin

Unix timestamp'leri her zaman UTC olduğundan, yaz saati uygulamasından kaynaklanan hataların tamamını ortadan kaldırır. Uygulamanın birden fazla saat dilimindeki kullanıcılara hizmet veriyorsa, Unix timestamp depolayıp yerel saate dönüşümü yalnızca gösterim katmanında yapmak, kanıtlanmış bir mimari kalıptır.

Unix timestamp'lerini 32-bit işaretli integer olarak depoluyorsan 2038 Yılı Sorunu'na dikkat et; modern sistemlerde her zaman 64-bit integer kullan.

ISO 8601 Tarih Formatı Ne Zaman Kullanılır?

ISO 8601 tarih formatı, insanların veya harici sistemlerin kod çalıştırmadan tarihleri okuyup yazması ya da doğrulaması gereken bağlamlarda öne çıkar.

1. Üçüncü Taraflara Sunulan API Yanıtlarında

Herkese açık bir API geliştiriyorsan, "created_at": "2024-05-01T12:30:00Z" döndürmek, "created_at": 1714562200 döndürmekten çok daha geliştirici dostudur. Harici geliştiriciler değeri dönüştürmek zorunda kalmadan anında anlayabilir. Stripe ve GitHub dahil pek çok API stil kılavuzu bu nedenle varsayılan olarak ISO 8601 kullanır.

2. Log Dosyaları ve Denetim İzlerinde

Log'lar, olaylar sırasında insanlar tarafından okunur. [2024-05-01T14:22:05Z] ERROR: ödeme başarısız gibi bir log satırı anında harekete geçirebilir. [1714569725] ERROR: ödeme başarısız içeren bir log ise okuyucuyu debug'a başlamadan önce timestamp'i dönüştürmeye zorlar.

3. Uluslararasılaştırma ve Yerelleştirmede

ISO 8601, açık saat dilimi ofset bilgisi içerir. Sisteminin kullanıcının orijinal yerel saatini koruması gerektiğinde (örneğin Tokyo'da sabah 9:00'da oluşturulan bir takvim etkinliği), doğru ofesetle birlikte ISO 8601 (2024-05-01T09:00:00+09:00) bu niyeti tam olarak yansıtır. Tek başına bir Unix timestamp, kullanıcının etkinliği oluştururken hangi saat diliminde olduğunu söyleyemez.

4. Yapılandırma Dosyaları ve Veri Alışveriş Formatlarında

İnsanların düzenlediği JSON, YAML ve CSV dosyalarında ISO 8601 kullanılmalıdır. Bir geliştirici yapılandırma dosyasına manuel olarak son kullanma tarihi girmesi gerektiğinde, 2025-01-01T00:00:00Z yazmak, Unix timestamp hesaplayıp elle girmekten çok daha az hata riskine sahiptir.

JavaScript ve Python'da Kod Örnekleri

JavaScript: Formatlar Arası Dönüşüm

// Mevcut Unix timestamp'i al (saniye cinsinden)
const unixNow = Math.floor(Date.now() / 1000);
console.log(unixNow); // örn. 1714521600

// Unix timestamp'i ISO 8601 string'e dönüştür
const isoString = new Date(unixNow * 1000).toISOString();
console.log(isoString); // "2024-05-01T00:00:00.000Z"

// ISO 8601 string'i tekrar Unix timestamp'e dönüştür
const parsed = new Date("2024-05-01T00:00:00Z");
const backToUnix = Math.floor(parsed.getTime() / 1000);
console.log(backToUnix); // 1714521600

// İki Unix timestamp arasındaki süreyi hesapla (parse gerekmez)
const start = 1714521600;
const end = 1714608000;
const durationSeconds = end - start;
console.log(`Süre: ${durationSeconds / 3600} saat`); // 24 saat

Python: Her İki Formatla Çalışmak

import time
from datetime import datetime, timezone

# Mevcut Unix timestamp'i al
unix_now = int(time.time())
print(unix_now)  # örn. 1714521600

# Unix timestamp'i ISO 8601 string'e dönüştür
dt = datetime.fromtimestamp(unix_now, tz=timezone.utc)
iso_string = dt.isoformat()
print(iso_string)  # "2024-05-01T00:00:00+00:00"

# ISO 8601 string'i tekrar Unix timestamp'e dönüştür
parsed_dt = datetime.fromisoformat("2024-05-01T00:00:00+00:00")
back_to_unix = int(parsed_dt.timestamp())
print(back_to_unix)  # 1714521600

# Süre hesaplama - Unix timestamp'lerle çok kolay
start = 1714521600
end = 1714608000
duration_hours = (end - start) / 3600
print(f"Süre: {duration_hours} saat")  # 24.0 saat

Önemli: Python'da datetime.fromtimestamp() çağırırken her zaman tz=timezone.utc parametresini geç. Bunu yapmadığında Python, sistemin yerel saat dilimini kullanır; bu da farklı bölgelerdeki sunucularda yanlış sonuçlar üretebilir.

Somut Örnek: Rezervasyon Sistemi

Bir otel rezervasyon API'si geliştirdiğini düşün. New York'taki bir kullanıcı, 15 Haziran 2024 saat 15:00 yerel saatte giriş için oda rezervasyonu yapıyor. İki formatın pratikte nasıl farklı davrandığına bakalım.

Unix timestamp olarak depolama: Kullanıcının yerel saatini UTC'ye dönüştürüp 1718470800 değerini depolarsın. Bu değer hem kompakt hem de sorgu için hızlıdır. Ancak New York'taki otel personeli ham veritabanı kaydına baktığında yalnızca bir sayı görür ve bunu çözmek için bir araca ihtiyaç duyar. Daha da kötüsü, kaydetmeden önce yerel saati UTC'ye dönüştürmeyi unutursan, sessiz bir 4 saatlik bug oluşturursun (New York yazın UTC-4'tür).

ISO 8601 olarak depolama: 2024-06-15T15:00:00-04:00 değerini depolarsın. Ofset korunur, personel kaydı doğrudan okuyabilir ve orijinal saat dilimi niyeti kaybolmaz. Ancak SQL'de string karşılaştırmaları biraz daha yavaştır ve "girişe kaç saat kaldı" hesaplamak için önce string'i parse etmek gerekir.

Çoğu ekibin production'da kullandığı çözüm: Performans ve doğruluk için veritabanında Unix timestamp depola, kullanılabilirlik için API yanıtında ISO 8601 string döndür. Bu, büyük platformların kullandığı kalıptır. Her iki formatın da avantajlarından yararlanırsın.

Dönüşüm kalıplarına ilişkin kapsamlı bir rehber için Unix timestamp'ten tarihe dönüşüm rehberimize göz atabilirsin.

Kullanım Senaryosuna Göre Net Öneriler

Gerçek kısıtlamalar göz önünde bulundurulduğunda, her senaryo için doğrudan öneriler şöyle:

  • Veritabanı depolama: Unix timestamp (integer) kullan. Daha hızlı indeksleme, saat dilimi parse'ı yok, daha küçük alan.
  • Dahili mikroservis iletişimi: Unix timestamp kullan. Her iki taraf da sözleşmeyi kontrol eder ve ham payload'ı hiçbir insan okumaz.
  • Herkese açık REST API yanıtları: ISO 8601 kullan. Üçüncü taraf geliştiricilerin okunabilir, kendini belgeleyen değerlere ihtiyacı var.
  • Log dosyaları ve denetim izleri: ISO 8601 kullan. İnsanlar olaylar sırasında baskı altında log okur.
  • JWT ve oturum son kullanma tarihi: Unix timestamp kullan. Spesifikasyon bunu gerektirir ve karşılaştırma tek bir işlemdir.
  • Yapılandırma dosyaları ve zamanlanmış görevler: ISO 8601 kullan. İnsanlar bu dosyaları doğrudan yazar ve düzenler.
  • Takvim ve zamanlama özellikleri: Açık saat dilimi ofesetiyle ISO 8601 kullan. Kullanıcının orijinal saat dilimi niyetini korur.
  • Uygulama mantığında tarih aritmetiği: Önce Unix timestamp'e dönüştür, hesapla, gerekirse geri dönüştür.

Backend kodunda timestamp'lerle çalışmaya ilişkin daha geniş bir en iyi pratikler seti için geliştiriciler için Unix timestamp rehberimiz depolama, formatlama ve saat dilimi yönetimindeki kalıpları ayrıntılı biçimde ele alıyor.

Sonuç

Unix timestamp formatı ile ISO 8601 tarih formatı arasındaki tartışma, hangisinin daha üstün olduğuyla ilgili değildir. Doğru aracı doğru işe eşleştirmekle ilgilidir. Unix timestamp'leri veritabanı sütunlarına, dahili servis sözleşmelerine ve son kullanma mantığına aittir. ISO 8601 ise API yanıtlarına, log'lara ve herhangi bir insanın açabileceği dosyalara aittir. Sağlam production sistemlerinin büyük çoğunluğu her ikisini birden kullanır: Unix time olarak depola, ISO 8601 olarak sun. Bu tek kalıbı içselleştirirsen, en yaygın tarih yönetimi bug'larını production'a ulaşmadan önlemiş olursun.

Ücretsiz Unix Timestamp Dönüştürücü Aracı - Unix time ile ISO 8601 arasında anında dönüşüm

Hangi Tarih Formatını Kullanacağını Tahmin Etmeyi Bırak

unixtimestamp.app'teki ücretsiz Unix Timestamp dönüştürücümüzü dene ve Unix time ile ISO 8601 arasında anında dönüşüm yap; kod yazmana gerek yok. Bir timestamp yapıştır, saniyeler içinde okunabilir tarihi al.

Ücretsiz Aracı Dene →

Evet, pek çok veritabanı ISO 8601'i dahili olarak depolayan yerel datetime tiplerini destekler. Ancak integer Unix timestamp'leri genellikle aralık sorguları ve indeks karşılaştırmaları için daha hızlıdır. Sık tarih bazlı filtreleme yapılan yüksek hacimli tablolarda integer timestamp'leri, string veya datetime sütunlarına kıyasla ölçülebilir bir performans avantajı sağlar.

Unix timestamp'leri tanımı gereği her zaman UTC'dir. Saat dilimi bilgisi depolamazlar. Bir Unix timestamp'i kullanıcının yerel saat diliminde görüntülemek için sunum katmanında dönüşüm yaparsın. Bu aslında bir avantajdır: depolanan değerde sıfır belirsizlik vardır ve saat dilimi dönüşümü, ait olduğu yerde açıkça ele alınır.

Saniye tabanlı Unix timestamp'leri (örn. 1714521600), çoğu Unix sisteminde ve JWT gibi standartlarda kullanılan geleneksel formattır. Milisaniye (örn. 1714521600000) ise JavaScript ve tarayıcı ortamlarında yaygındır. Bir API'nin hangi hassasiyeti beklediğini her zaman doğrula; milisaniye beklenirken saniye göndermek, tarihleri 1000 kat geçmişte üretir.

RFC 3339, ISO 8601'in özellikle internet kullanımı için tasarlanmış bir profilidir. Biraz daha katıdır: Z veya +00:00 gibi bir saat dilimi ofsetini zorunlu kılar ve bazı isteğe bağlı ISO 8601 özelliklerine izin vermez. Pratikte çoğu geliştirici, 2024-05-01T00:00:00Z gibi standart tarih-saat string'leri için ikisini birbirinin yerine kullanır.

GitHub, REST API yanıtlarında ISO 8601 string'leri kullanır. Stripe ise API'sinde Unix timestamp'leri (integer) kullanır. Her iki tercih de bilinçli alınmış ve kendi kullanım senaryolarıyla tutarlıdır. Bu durum, sektör genelinde tek bir kural olmadığını açıkça gösteriyor; doğru seçim, API'nin hedef kitlesine ve tüketicilerin değerler üzerinde yapması gereken işlemlere bağlıdır.