Geliştiriciler

Unix Zaman Damgası Nedir? Epoch Time'ı Anlamak

7 dk okuma

Unix zaman damgası (epoch time), 1 Ocak 1970, 00:00:00 UTC’den bu yana geçen saniye sayısıdır. 1700000000 gibi tek bir sayı, dünyanın neresinde olursanız olun aynı anı temsil eder ve bu yüzden neredeyse her veritabanı, API ve log dosyası tarihleri bu şekilde saklar.

Unix zaman damgası aslında nedir

Unix epoch’u, bilgisayar bilimlerinde ortak bir sıfır noktası olarak kabul edilen 1 Ocak 1970, 00:00:00 UTC anıdır. Bir zaman damgası, o andan itibaren kaç saniye geçtiğini sayan tek bir tam sayıdır. 0 epoch’un kendisidir, pozitif sayılar 1970’ten sonrasını, negatif sayılar ise öncesini ifade eder.

Bunun neden bu kadar yaygın kullanıldığını anlamak zor değil. "14 Kasım 2023, 22:13:20" gibi biçimlendirilmiş bir metin ayrıştırma gerektirir, dile göre değişir ve saat dilimi belirtilmezse belirsizdir. Tek bir tam sayı ise hem kompakttır hem de saat diliminden tamamen bağımsızdır: 1700000000 her yerde, her sistemde aynı anı gösterir. İki zaman damgasını karşılaştırmak da basit bir çıkarma işlemidir, oysa iki tarih metnini karşılaştırmak önce ikisini de aynı formata çevirmenizi gerektirir. Bir API yanıtındaki created_at alanı, bir cron görevinin çalışma zamanı ya da bir JWT’nin exp (süre sonu) alanı, hep bu yüzden zaman damgası olarak taşınır: sıralamak, karşılaştırmak ve üzerinde aritmetik yapmak kolaydır.

Bir örnek üzerinden düşünelim. Bir sunucu log dosyasındaki her satır genelde [1700000000] GET /api/users 200 gibi bir zaman damgasıyla başlar. Log analiz aracınız binlerce satırı zaman sırasına dizecekse, metin karşılaştırması yerine bu tam sayıları sıralamak hem daha hızlıdır hem de saat dilimi kaynaklı bir hataya yer bırakmaz. Aynı mantık bir JWT’nin exp alanı için de geçerlidir: sunucu, token’ın süresinin dolup dolmadığını anlamak için sadece kendi anlık zaman damgasını exp değeriyle karşılaştırır, ne bir tarih ayrıştırıcısına ne de saat dilimi dönüşümüne ihtiyaç duyar.

Örneklerle okuma: gerçek zaman damgası değerleri

Aşağıdaki tablo birkaç zaman damgasını ve bunların UTC karşılığını gösteriyor:

Unix zaman damgası (saniye)UTC tarih ve saat
01 Ocak 1970, 00:00:00 UTC (epoch’un kendisi)
10000000009 Eylül 2001, 01:46:40 UTC
170000000014 Kasım 2023, 22:13:20 UTC
200000000018 Mayıs 2033, 03:33:20 UTC
214748364719 Ocak 2038, 03:14:07 UTC

1700000000 değerine biraz daha yakından bakalım. Bir yılda yaklaşık 31.536.000 saniye vardır (365 gün × 24 saat × 3600 saniye). 1700000000’ı bu sayıya bölerseniz kabaca 53,9 çıkar, yani epoch’tan bu yana geçen 53-54 yıl civarı bir süre, ki bu da bizi 1970’in üzerine 53 yıl ekleyerek 2023’e götürür. Tam saat ve dakikayı elle çıkarmak pratik değildir (artık yıllar işi karmaşıklaştırır), ama tablonun neden o satıra düştüğünü sezgisel olarak görmek için bu kaba hesap yeterli. Son satırdaki 2147483647 ise rastgele bir sayı değil: bu, 32 bitlik işaretli bir tam sayının alabileceği en büyük değer ve aşağıda göreceğimiz “2038 sorunu”nun tam olarak sınırı.

Saniye mi, milisaniye mi? Aradaki farkı ayırt etmek

Bu, geliştiricilerin en sık düştüğü tuzaklardan biri. Saniye cinsinden bir zaman damgası bugün 10 haneli görünür, 1700000000 gibi. Milisaniye cinsinden aynı an ise 13 haneli olur: 1700000000000, yani gene 14 Kasım 2023.

JavaScript’in Date.now() fonksiyonu ve tarayıcı tabanlı birçok web API’si milisaniye döndürür, çünkü JavaScript Date nesnesi dahili olarak milisaniye hassasiyetiyle çalışır. Buna karşılık Unix sistem çağrıları, cron zamanlayıcısı ve çoğu Unix/Linux komut satırı aracı (date +%s gibi) saniye kullanır. İki sistemi bir araya getirdiğinizde, örneğin bir JavaScript uygulamasından gelen milisaniye değerini saniye bekleyen bir Python betiğine ya da bir SQL sorgusuna aynen yapıştırdığınızda, sayı 1000 kat büyük yorumlanır ve tarih uzak geleceğe fırlar; 1700000000000 saniye olarak okunursa yıl 55.000’lerin üzerine çıkar. Bir zaman damgasının kaç hane olduğuna bakmak, hangi birimde olduğunu anlamanın en hızlı yoludur.

Zaman damgasını tarihe çevirme

Elinizde bir log dosyasından ya da bir API yanıtından kopyaladığınız çıplak bir sayı varsa ve bunun hangi ana denk geldiğini görmek istiyorsanız, aşağıdaki araç işi görür. Sayıyı yapıştırın, saniye mi milisaniye mi olduğunu araç otomatik anlar ve size okunabilir tarihi verir.

Unix Zaman Damgasından Tarih ve Saate Dönüştürücü
Ücretsiz, kayıt yok, her cihazda çalışır.
Tam aracı aç

Tarihi zaman damgasına çevirme

Ters yönde de ihtiyaç sık çıkar: belirli bir tarih ve saat için, örneğin bir cron görevini belirli bir güne planlamak ya da bir API’ye “şu andan itibaren” filtresi geçmek için sayısal zaman damgası gerekir. Aşağıdaki araca istediğiniz tarih ve saati girin, karşılığındaki Unix zaman damgasını anında görün.

Unix (saniye)
Unix (milisaniye)
UTC tarih ve saat
Yerel tarih ve saat

Yaygın hatalar ve uç durumlar

Saniye ile milisaniyeyi karıştırmak. Yukarıda değindiğimiz gibi, bu en sık karşılaşılan hata. Bir değeri bir sisteme aktarmadan önce hane sayısına bakmak (10 mu, 13 mü) çoğu zaman sorunu baştan önler.

2038 yılı sorunu. Zaman damgasını 32 bitlik işaretli bir tam sayı olarak saklayan eski sistemler, 2147483647 değerinde (19 Ocak 2038, 03:14:07 UTC) taşar. Bu sayıya bir saniye eklendiğinde, işaretli 32 bit aritmetiğinde sonuç negatif bir sayıya döner ve tarih mantığı bozulur; bazı sistemlerde saat 1901’e geri sıçrar. Modern 64 bitlik sistemlerde zaman damgası çok daha büyük bir aralığa sığdığı için bu sınır pratikte yoktur, ama gömülü sistemler ve eski C kütüphaneleri hâlâ risk altında olabilir.

Saat dilimi karışıklığı. Unix zaman damgasının kendisinin saat dilimi yoktur, o mutlak bir andır. Karışıklık, o anı nasıl görüntülediğinizden kaynaklanır: UTC olarak mı, yoksa yerel saat olarak mı gösteriyorsunuz? İstanbul’daki biri ile New York’taki biri aynı 1700000000 değerine baktığında saat göstergesi farklı çıkar (biri 14 Kasım gece yarısına yakınken diğeri öğleden önce görür), ama ikisi de aynı fiziksel anı işaret eder. Bir created_at alanını kullanıcıya gösterirken hangi saat dilimine çevirdiğinizi bilerek yapmak, sessiz hatalardan kaçınmanın anahtarıdır.

Negatif zaman damgaları. 1970’ten önceki tarihler negatif sayılarla ifade edilir; örneğin -86400, 31 Aralık 1969’u gösterir (epoch’tan tam bir gün önce, 86400 saniye = 24 saat). Her araç ve sistem negatif değerleri desteklemez, bazı API’ler ve veritabanı şemaları sıfırın altına inen değerleri reddeder veya hatalı yorumlar, bu yüzden 1970 öncesi tarihlerle çalışıyorsanız hedef sistemin bunu destekleyip desteklemediğini önceden kontrol etmek gerekir.

Ondalıklı ya da bilimsel gösterimli değerler. Bazı API’ler zaman damgasını 1700000000.123 gibi ondalık kısımla döndürür (saniyenin altındaki kesir) ya da bir tablo yazılımı büyük sayıyı 1.7e9 gibi bilimsel gösterime yuvarlar. Bu değeri elle bir tam sayı alanına yapıştırmadan önce ondalık kısmı ve gösterim biçimini kontrol etmek, sessizce yanlış bir tarihe düşmeyi önler.

Sıkça sorulan sorular

Unix zaman damgası nedir? 1 Ocak 1970, 00:00:00 UTC’den (Unix epoch) bu yana geçen saniye sayısıdır. Tek bir tam sayı olarak belirli bir anı temsil eder ve saat diliminden bağımsızdır.

Zaman damgamın saniye mi milisaniye mi olduğunu nasıl anlarım? Hane sayısına bakın. Bugünün tarihleri için saniye cinsinden değerler 10 hanelidir (1700000000 gibi), milisaniye cinsinden değerler ise 13 hanelidir (1700000000000 gibi). JavaScript’ten geliyorsa büyük ihtimalle milisaniyedir, bir Unix komutundan ya da cron’dan geliyorsa büyük ihtimalle saniyedir.

2038 yılı sorunu nedir? 32 bitlik işaretli tam sayı ile zaman damgası tutan sistemlerin, 2147483647 (19 Ocak 2038, 03:14:07 UTC) değerinde taşarak negatif bir sayıya dönmesi ve tarih hesaplarının bozulmasıdır. 64 bitlik sistemler bu sınırdan çok daha uzakta olduğu için etkilenmez, ama eski gömülü donanım ve yazılımlarda hâlâ gerçek bir risktir.

1970’ten önceki bir tarihi çevirebilir miyim? Evet, negatif bir zaman damgasıyla. -86400 örneğin 31 Aralık 1969’u ifade eder. Ancak her sistem negatif değerleri kabul etmez, bu yüzden kullandığınız araç ya da veritabanının bunu desteklediğinden emin olun.

Veritabanları neden tarihleri metin yerine Unix zaman damgası olarak saklar? Çünkü bir tam sayı, biçimlendirilmiş bir tarih metninden daha kompakt, saat diliminden bağımsız ve karşılaştırması çok daha ucuzdur. İki zaman damgasını sıralamak ya da aralarındaki farkı bulmak basit bir çıkarma işlemidir; iki tarih metnini karşılaştırmak ise önce ayrıştırma gerektirir ve yerel ayarlara (locale) bağlı hatalara açıktır.

İki zaman damgası arasındaki farkı nasıl hesaplarım? Büyük olandan küçük olanı çıkarın, sonuç saniye cinsinden farktır. Örneğin 1700000000 ile 1000000000 arasındaki fark 700000000 saniyedir; bunu 86400’e bölerseniz yaklaşık 8101 güne, yani yaklaşık 22 yıla denk geldiğini görürsünüz. Bu, iki tarih metnini ayrıştırıp çıkarmaktan çok daha az hataya açık bir yöntemdir.

Unix Zaman DamgasıEpoch TimeProgramlamaTarih Dönüştürme
Unix Zaman Damgasından Tarih ve Saate Dönüştürücü
Şimdi tam araçla kendin dene.
Şimdi dene