Skip to content

Guide

Unix Zaman Damgaları: Epoch, Hassasiyet ve 2038 Yılı Sorunu

Dünyanın en yaygın zaman biçimi, 12 yıllık bir fitili olan 56 yıllık geçici bir çözümdür.

By Published

Bir Unix zaman damgası, zamanı sabitleyen tek bir tamsayıdır. Bilişimdeki en yaygın kullanılan zaman biçimidir; her veritabanı, log satırı, JWT ve HTTP çerezi nihayetinde ona dayanır. Aynı zamanda verileriniz bozulana kadar kendini belli etmeyen tuzaklarla doludur.

Tam olarak nedir

Unix zaman damgası, 1970-01-01T00:00:00 UTC’den, genellikle “Unix epoch” olarak adlandırılan andan itibaren geçen saniye (ya da milisaniye, mikrosaniye, nanosaniye — bir birim seçin) sayısıdır. Bugün bu, saniyeler için 1,7 milyar civarında, milisaniyeler için ise 1,7 trilyon civarında bir sayıdır.

Herhangi bir tamsayıyı UTC tarihine, yerel tarihe ve göreli zamana dönüştürmek için zaman damgası dönüştürücümüzü kullanabilirsiniz.

Neden 1970?

Bu seçim derin bir anlam taşımıyor. Bell Labs, 1971’de Unix v1’i yayımladı ve zaman sayacı için rastgele yakın bir tarihe ihtiyaç duydu. Daha önceki bir prototip, 1971-01-01’den itibaren 1/60 saniyelik tikler sayıyordu ancak 32-bitlik sayaç 2,5 yıldan kısa sürede taşacaktı. Ekip tam saniyelere geçti ve epoch’u 1970-01-01’e geri aldı; böylece önceki yıl tarihleri negatif sayılarla temsil edilebildi. Her aşağı yönlü sistem bunu benimsediği için kalıcı oldu.

Hassasiyet: saniye, ms, μs, ns

Yığının farklı katmanları farklı birimler kullanır:

  • Saniye — klasik Unix time(), JWT iat/exp talepleri, HTTP Date başlıkları, çoğu elektronik tablo dışa aktarması.
  • Milisaniye — JavaScript Date.now(), Java System.currentTimeMillis(), Kafka kayıt zaman damgaları, MongoDB ObjectId(ilk 4 bayt epoch’tan itibaren saniyedir, BSON’da diğer alanlarla paketlenmiştir).
  • Mikrosaniye — Postgres TIMESTAMP, MySQL DATETIME(6), izleme kütüphaneleri (Jaeger, OpenTelemetry).
  • Nanosaniye — Linux clock_gettime(CLOCK_REALTIME), Go time.Now().UnixNano(), etcd, yakın dönem OpenTelemetry dışa aktarıcıları.

API sınırında hiçbir zaman varsayımda bulunmayın. 1700000000saniye olarak okunursa Kasım 2023’tür; milisaniye olarak okunursa 1970 Ocak’ından 20 gün sonrasıdır. Pratik bir kural: tamsayı yaklaşık 10 haneliyse saniye, 13 haneliyse milisaniye, 16 haneliyse mikrosaniye, 19 haneliyse nanosaniyedir. Zaman damgası aracımız dördünü de otomatik olarak algılar.

Artık saniyeler: altındaki yalan

POSIX, Unix zaman damgasını her günün tam olarak 86.400 saniye olduğunu açıkça varsayarak “epoch’tan bu yana geçen saniye” olarak tanımlar. Gerçek UTC ise böyle değildir. 1972’den bu yana Dünya’nın dönüşüyle UTC’yi hizalamak için 27 pozitif artık saniye eklenmiştir. En son 30 Haziran 2017’de eklendi.

Katı POSIX davranışı, artık saniye sırasında saati dondurmaktır:1483228827zaman damgası arka arkaya iki kez sunulur. Bu monotonluğu bozar ve zaman damgalarının benzersiz olduğunu varsayan her şeyi çöküştürür. Google’ın alternatifi olan “artık yayma”, ekstra saniyeyi 24 saatlik bir pencereye yayar; AWS, Meta ve Microsoft de aynı yöntemi benimser. Farklı şemalar kullanan iki sunucu, bir artık olay etrafında yarım saniyeye kadar anlaşmazlık yaşayabilir.

Uygulamaların %99’u için bu önemli değildir. Birden fazla sağlayıcıda milisaniyenin altında hassasiyetle olayları sıralayan her şey için kesinlikle önemlidir.

2038 yılı sorunu

İşaretli bir 32-bitlik tamsayı, −2.147.483.648 ile+2.147.483.647arasındaki değerleri tutabilir. 1970-01-01 UTC’den itibaren saniye olarak yorumlandığında üst sınır 2038-01-19T03:14:07Z’dir. Bir saniye sonra sayaç en negatif değere döner ve 13 Aralık 1901’i temsil eder.

Modern 64-bit işletim sistemleri, başka 292 milyar yıl daha taşmayacak olan 64-bit time_t kullanır. Kalan riskler:

  • Gömülü cihazlar— otomotiv ECU’ları, endüstriyel PLC’ler, tıbbi implantlar. Pek çoğu hâlâ 32-bit zaman kullanır ve güncellenmez.
  • Dosya biçimleri — ext2/ext3 inode zaman damgaları, klasik ZIP (DOS biçimi), eski NTFS genişletilmiş öznitelikleri.
  • SQL sütunları— epoch saniyeleri için “yer tasarrufu” amacıyla INTolarak tanımlanmış sütunlar. Şemalarınızı şimdi denetleyin, 2037’yi beklemeyin.
  • 32-bit ARM üzerinde eski libc’ye karşı derlenen eski C kodu. 64-bit time_t’ye geçiş bir ABI kırılmasıdır ve pek çok tedarikçi bunu yapmamıştır.

Daha ayrıntılı bilgi için Unix zaman damgası sözlük girdimize bakın.

Unix zamanı ve ISO 8601

ISO 8601 (ve İnternet profili RFC 3339), zamanı2026-05-31T14:30:00Z olarak yazar. İnsan tarafından okunabilir, saat dilimine duyarlı ve kendiliğinden açıklayıcıdır. Unix zamanı ise kompakt, tamsayı olarak sıralanabilir ve gerçek an hakkında belirsizlik içermez; ancak yazarın görüntüleme için hangi saat dilimini düşündüğü hakkında hiçbir şey söylemez.

API’lerde, loglarda ve bir insanın değeri okuyacağı her yerde ISO 8601 kullanın. Alan ve aritmetik önemli olduğunda ya da sıralama ucuz olması gerektiğinde Unix tamsayıları kullanın. Pek çok sistem her ikisini de taşır. Tam dilbilgisi için ISO 8601 sözlük girdisine bakın.

Yaygın tuzaklar

Saat diliminden bağımsız ayrıştırma

JavaScript’teki new Date("2026-05-31"), UTC gece yarısı olarak ayrıştırılır; ancaknew Date("2026-05-31 14:00") (T yerine boşluk) çoğu motorda yerel saat olarak ayrıştırılır. Ortaya çıkan Unix zaman damgaları farkınız kadar sapma gösterir. Tam olarak kontrol etmediğiniz girdilerde her zaman saat dilimi göstergesini (Z, +09:00) dahil edin.

Birimlerin sessizce karıştırılması

Milisaniye yayan bir mikro servis, saniye bekleyen bir tüketiciye bağlanır. Tüketici 55000 yılındaki zaman damgalarını görür ve bunları sessizce veritabanına yazar. Gelen zaman damgalarının büyüklüğünü her zaman makul bir aralığa karşı doğrulayın.

Yerel saat epoch’ları

Bazı eski sistemler “yerel saatle 1970-01-01’den bu yana geçen saniye” hesaplar. Bu Unix zamanı değildir ve bir sunucu taşındığında ya da yaz saati uygulaması değiştiğinde bozulur. Bunlardan birini miras alırsanız, offset’i tamsayının yanı sıra kaydedin ve sınırda gerçek UTC epoch’una dönüştürün.

Dönüştürücüyü deneyin

Herhangi bir tamsayıyı zaman damgası dönüştürücümüze yapıştırarak UTC ve yerel yorumları yan yana görebilir, saniye/ms/μs/ns otomatik algılamasından yararlanabilirsiniz. Toplu dönüştürme veya ekstra hassasiyet kontrolleri için datetime zaman damgası aracı her iki yönü de destekler.

Özet

Unix zamanı, kompakt, sıralanabilir ve an hakkında belirsizlik içermediği için harika bir varsayılandır. Hangi birimde olduğunuzu, hangi saat dilimini görüntülemek istediğinizi veya depolama alanınızın 32-bit olup olmadığını unuttuğunuz anda berbat bir varsayıma dönüşür. Epoch, 1970’te pragmatik bir seçimdi; 2038 uçurumu ise ödenecek faturadır. Tamsayı sütunlarınızı denetleyin, birimlerinizi belgeleyin ve yerel saat epoch’ları saklamayın.

Frequently asked questions

Neden 1 Ocak 1970?
Bell Labs, Unix v1’i 1971’de yayımlarken yakın geçmişte yuvarlak bir tarih olarak seçti. Daha önceki prototip sürümler 1971-01-01’den itibaren 1/60 saniyelik tikler kullanıyordu; 32-bitlik sayacın taşması yaklaşık 2,3 yıl içinde gerçekleşecekti. Ekip tam saniyelere geçip başlangıç noktasını 1970-01-01 UTC’ye geri aldı. Bu pratik bir tercihti, felsefi değil.
Artık saniyeler Unix zamanında sayılır mı?
Hayır. POSIX, Unix zaman damgasını her gün tam olarak 86.400 saniye olduğunu varsayarak epoch’tan bu yana geçen saniye sayısı olarak tanımlar. Gerçek UTC zaman zaman artık saniye eklemiştir (en son 30 Haziran 2017). Çoğu sistem bunu ya sayacı bir saniye dondurarak ya da artık saniyeyi daha uzun bir aralığa yayarak (Google’ın yaklaşımı) yönetir. Sonuç olarak aynı Unix zaman damgası, pozitif bir artık saniye sırasında iki farklı gerçek zamana karşılık gelebilir.
2038’de tam olarak ne bozulur?
19 Ocak 2038’de 03:14:07 UTC’de işaretli 32-bitlik saniye sayacı taşarak 13 Aralık 1901’i temsil eden negatif bir sayıya döner. Zaman için işaretli int32 kullanan 32-bitlik sistemler, gömülü cihazlar, dosya biçimleri ve veritabanı sütunları bozulur. 64-bit Linux yıllar önce geçişi tamamladı; kalan risk gömülü sistemlerde, eski dosya biçimlerinde (ext2/3 inode zaman damgaları, ZIP DOS zaman damgaları) ve INT olarak tanımlanmış SQL sütunlarında bulunmaktadır.
Zaman damgalarını tamsayı mı yoksa ISO 8601 dizesi olarak mı saklamalıyım?
Aritmetik yapacaksanız ve depolama boyutu önemliyse tamsayılar kullanın. Veriler insan tarafından okunacaksa veya orijinal saat dilimini korumak gerekiyorsa ISO 8601 dizeleri kullanın. Pek çok sistem her ikisini de saklar: sıralama ve aritmetik için UTC epoch ms, denetim için orijinal saat dilimi duyarlı ISO dizesi. Yerel saat epoch değerlerini saklamayın; bir sunucu saat dilimlerini değiştirdiği anda veriler sessizce bozulur.
Saniye, milisaniye, mikrosaniye ve nanosaniye arasındaki fark nedir?
Salt ölçek. JavaScript’in Date.now() fonksiyonu epoch’tan itibaren milisaniye döndürür. clock_gettime(CLOCK_REALTIME) gibi Unix sistem çağrıları genellikle nanosaniye döndürür. Veritabanı TIMESTAMP türleri tedarikçiye göre değişir: Postgres mikrosaniye, MySQL DATETIME(6) mikrosaniye, SQL Server 100 ns tikler kullanır. Her zaman API sınırındaki birimi belgeleyin.
Unix zaman damgası saat dilimine duyarlı mıdır?
Evet ve hayır. Zaman damgasının kendisi sabit bir UTC anından itibaren mutlak bir saniye sayısıdır, dolayısıyla belirsizlik içermez. Ancak görüntüleme saat dilimi taşımaz; takvim tarihine geri dönüştürmek için bir saat dilimi seçimi gerekir. 1700000000 zaman damgası her yerde aynı fiziksel anı temsil eder, ancak Tokyo’da 14 Kasım, Los Angeles’ta 13 Kasım olarak görüntülenir.

Related

Published May 31, 2026