Guide
Epoch, ISO 8601 mi RFC 3339 mü? API Tarih Formatı
Aynı an için üç format ve yalnızca biri belgeleri okumadan belirsizlikten uzaktır.
By Buğra SözeriPublished
Tarihlere dokunan her API sonunda tek bir soruyu yanıtlamak zorunda kalır: bir zaman damgası alanı ağ üzerinde gerçekte neye benzer? Yaygın kullanımda gerçekten üç aday vardır — ham bir Unix epoch tamsayısı, bir ISO 8601 dizesi ve onun daha sıkı kuzeni RFC 3339. Hepsi zamanda aynı anı tanımlar, ama akış aşağısında bir şeyler yanlış gittiğinde farklı biçimde bozulurlar ve doğru olanı baştan seçmek, sonrasında koca bir “bu tarih neden birkaç saat kaymış” hata raporu kategorisini önler.
Her formatın gerçekte ne olduğu
Bir Unix epoch zaman damgasıbir tamsayıdır: POSIX'in time_ttanımına göre 1970-01-01T00:00:00Z'den bu yana geçen saniye (veya milisaniye, ya da daha az yaygın olarak mikrosaniye veya nanosaniye) sayısı. Hiçbir saat dilimi taşımaz — yapısı gereği her zaman UTC'ye görelidir — ama hiçbir birim işareti de taşımaz; gerçek dünyadaki sorunlarının çoğu buradan gelir.
ISO 8601, tarih ve saatleri metin olarak temsil etmek için uluslararası standarttır ve kasten geniştir: takvim tarihlerine, hafta numaralandırmalı tarihlere, sıra tarihlerine, sürelere, aralıklara, azaltılmış hassasiyete (yalnızca bir yıl veya bir yıl ve ay) ve UTC farkı olan veya olmayan saat değerlerine izin verir. Bu esneklik, “ISO 8601 uyumlu” ifadesini kulağa geldiğinden daha zayıf bir garanti yapan tam olarak şeydir — iki sistem de teknik olarak uyumlu olabilir ve yine de birbirinin ayrıştıramayacağı dizeler üretebilir.
RFC 3339, ISO 8601'in IETF'in internete yönelik profilidir: tam olarak tek bir şekli korur (YYYY-MM-DDTHH:MM:SS[.ffffff](Z|±HH:MM)) ve ISO 8601'in izin verdiği ama otomatik ayrıştırmayı belirsiz kılacak her şeyi düşürür — hafta tarihi yok, azaltılmış hassasiyet yok ve bir fark zorunludur, asla ima edilmez. İnsanlar bir API bağlamında “ISO 8601 zaman damgası” dediğinde, neredeyse her zaman kastettikleri ve kodlarının neredeyse her zaman beklediği şey RFC 3339'dur.
| Format | Örnek | Kendini açıklıyor mu? | Belirsizlik riski |
|---|---|---|---|
| Epoch (saniye) | 1700000000 | Hayır | Yüksek — birim işaretlenmemiş |
| Epoch (milisaniye) | 1700000000000 | Hayır | Yüksek — birim işaretlenmemiş |
| ISO 8601 (genel) | 2023-11-14T22:13:20 | Kısmen | Orta — fark atlanabilir |
| RFC 3339 | 2023-11-14T22:13:20Z | Evet | Düşük — fark zorunlu, tek şekil |
Her biri gerçekte nerede bozulur
Epoch tamsayıları sessizce bozulur, bu da yüksek sesle bozulmaktan daha kötüdür. 1700000000, ister saniye (14 Kasım 2023) ister milisaniye (20 Ocak 1970) anlamına gelsin, kusursuz geçerli bir sayıdır — yanlış bir birim varsayımı hata fırlatmaz, yalnızca büyüklük sırasına göre yanlış olan ve birisi fark edene kadar makul görünen bir tarih üretir. Bu, epoch değerlerini farklı dillerde yazılmış servisler arasında aktaran sistemlerde en yaygın tek zaman damgası hatasıdır; her servisin kendi varsayılan birimi vardır.
Düz ISO 8601 dizeleri farkta bozulur. 2023-11-14T22:13:20 gibi bir dize, bir Z veya ±hh:mmolmadan geçerli bir ISO 8601'dir ama gerçekten belirsizdir — UTC mi, yerel sunucu saati mi, yoksa isteği başlatan kullanıcının yerel saati mi? Her tüketici tahmin etmek veya bant dışı belgelere başvurmak zorunda kalır ve farklı tüketiciler bazen farklı tahmin eder.
RFC 3339, yapısı gereği her iki hata modunu da büyük ölçüde önler; bu yüzden API stil kılavuzlarında varsayılan tavsiyedir — örneğin Google'ın AIP-142'si, yeni API'lerde zaman damgası alanları için onu zorunlu kılar. Kalan uç durumu, kesirli saniye hassasiyetidir: spesifikasyon, ondalık noktasından sonra herhangi bir sayıda haneye izin verir; bu yüzden nanosaniye hassasiyeti üreten bir üretici ile milisaniyeye kesen bir tüketici, bir birim uyuşmazlığından çok daha küçük bir marjla da olsa tam anda hâlâ anlaşamayabilir.
Yeni bir alan için format seçmek
Herkese açık veya servisler arası bir API için, varsayılan olarak bir RFC 3339 dizesi kullanın. Ham loglarda ve hata ayıklayıcılarda çözmeye gerek kalmadan okunabilir, hem saat dilimi hem de hassasiyet konusunda belirsizlik içermez ve neredeyse her ana akım dilin tarih kütüphanesi onu doğal olarak ayrıştırır ve üretir. Tek bedeli, bir tamsayıya kıyasla değer başına birkaç fazladan bayttır — neredeyse her API yükü için önemsiz.
Alan yüksek hacimli telemetri, bir metrik zaman damgası veya her üretici ve tüketicinin sizin kontrolünüzde olduğu ve birimde zaten anlaştığı dahili bir sıralama/anahtar olduğunda bir epoch tamsayısına başvurun. O zaman bile, kurala güvenmek yerine birimi alan adında açıkça belgeleyin (yalnızca created_at değil, created_at_ms). Belgelenmemiş bir epoch alanını tersine mühendislik yapmanız gerektiğinde hane sayısına dayalı birim tespitinin nasıl çalıştığını Unix zaman damgaları açıklaması rehberimiz kapsar.
Kısa özet
Epoch tamsayıları kompakttır ama birim taşımaz; düz ISO 8601 geniştir ama farkı atlayabilir; RFC 3339, çoğu API aracının “ISO tarihi” dediğinde gerçekte beklediği, ISO 8601'in dar, belirsizlik içermeyen dilimidir. Yeni bir alan tasarlıyorsanız ve yük boyutunu optimize etmek için güçlü bir nedeniniz yoksa, RFC 3339 tüm bir servisler arası zaman damgası hatası kategorisini daha başlamadan ortadan kaldırır.
Frequently asked questions
- RFC 3339, ISO 8601 ile aynı mı?
- RFC 3339, ISO 8601'in ayrı bir format değil, daha sıkı bir profilidir. ISO 8601'in izin verdiği birçok biçimden tek, belirsizlik içermeyen bir tanesini seçer — her zaman 4 haneli bir yıl, her zaman açık bir UTC farkı (Z veya ±hh:mm), hafta numaralandırmalı tarih yok, yalnızca '2026' gibi azaltılmış hassasiyette tarih yok. Herhangi bir RFC 3339 zaman damgası geçerli ISO 8601'dir; tersi garanti değildir.
- Yeni bir API epoch tamsayıları mı yoksa bir dize zaman damgası mı kullanmalı?
- Yeni bir alan için bir RFC 3339 dizesini tercih edin. Kendi kendini açıklar (bir log satırı veya hata ayıklayıcı, çözmeniz gereken 10 haneli bir sayı yerine gerçek tarihi gösterir), örtük bir birim anlaşması olmadan diller arasında sorunsuz gidip gelir ve kendi UTC farkını taşır. Epoch tamsayıları, yük boyutu önemli olduğunda (telemetri, yüksek frekanslı metrikler) veya bir alan tamamen dahili bir süre veya sıralama anahtarı olduğunda yerini kazanır.
- Zaman damgası hataları neden bu kadar sık saniye ile milisaniye arasında sıkışıyor?
- Çünkü bir epoch tamsayısı hiçbir birim işareti taşımaz — 1700000000, hem 2023 tarihi (saniye) hem de 1970 tarihi (milisaniye) olarak sessizce geçerlidir; bu yüzden yanlış bir varsayım hata vermez, yalnızca yanlış ama makul görünen bir tarih üretir. Bir dize formatı, hassasiyet yazılı olduğu için tüm bu hata sınıfını atlar: 2023-11-14T22:13:20.500Z kendiliğinden saniyenin altındadır.
- RFC 3339, UTC gerektirir mi?
- Hayır — Z (UTC) veya herhangi bir ±hh:mm değeri olabilen açık bir fark gerektirir. Yasakladığı şey, farkı tamamen atlamaktır; bu, ISO 8601'in teknik olarak izin verdiği ve gevşek tipli tarih dizelerinde 'bu yerel mi yoksa UTC mi?' belirsizliğinin tek en büyük kaynağı olan bir şeydir.
Sources & references
Authoritative references cited by this piece. Verified by Buğra Sözeri on the dates shown and re-checked at every deploy.
- IETF RFC 3339 — Date and Time on the Internet: Timestamps — API tasarımcılarının genellikle yönlendirildiği ISO 8601'in internet standardı profili(as of )
- ISO 8601-1:2019 overview — International Organization for Standardization — Ana standart; RFC 3339'dan daha geniştir ve RFC 3339'un kasten hariç tuttuğu biçimlere izin verir(as of )
- IEEE Std 1003.1-2024 (POSIX) — seconds since the Epoch — Unix zamanının (time_t) 1970-01-01T00:00:00Z'den bu yana geçen saniye sayısı olarak tanımı(as of )
- Google API Improvement Proposals — AIP-142: Time and duration — Yeni API'lerde zaman damgası alanları için RFC 3339 dizelerini zorunlu kılan, yaygın olarak atıf yapılan gerçek dünya API tasarım kılavuzu(as of )
Related
Published September 25, 2026